关于Java堆内存和系统RAM



我正在使用进程生成器从java执行python程序。创建了一个 shell 脚本文件,该文件设置了一些环境变量,然后执行 python 脚本。

Process p = Runtime.getRuntime().exec(executeAutoML.sh);

包含上述代码块的类将从Java调度程序(ScheduledExecutorService(调用。

我的Linux机器有大约30GB的内存。

我的问题是:

  1. python脚本用于分析目的。它将创建一些巨大的数据帧来处理数据。假设最大数据帧大小为 (100 万 x 100 (。它可以使用系统RAM或JVM堆吗?

  2. 如果它使用系统 RAm,那么我如何查看 RAM 消耗?

  3. 由于它处理巨大的数据量,我可以在 JVM 中出现内存不足错误吗? 信息:此程序在带有负载平衡器的 WLS 服务器(2 个节点(中启动。

请建议处理此类用例的最佳方法。

谢谢 维杰

  1. 使用 ProcessBuilder 运行的程序具有自己的虚拟地址空间。它不使用 Java 堆。即使您使用 ProcessBuilder 调用了另一个 Java 程序,它也是一个具有自己的内存/堆的独立进程。
  2. top/atop/Windows任务管理器这样的东西,显示您的所有进程。你的 python 进程应该单独显示。
  3. 1.的答案应该清楚地表明python进程的内存与JVM是分开的,所以只有当你实际耗尽物理(或者更确切地说是虚拟(内存时,你才会得到Java进程的OutOfMemory。当然,如果你的python进程用完了它,就会发生这种情况。

通常,对于如此庞大的数据任务,您需要仔细检查是否可以以较小的批次而不是一次处理所有数据。例如,如果您对不需要信息/影响其他行的数据行进行操作,那么您可以逐行加载,处理每一行,并在处理下一行之前将其写入结果文件。这样,您可以避免一次加载所有数据。

最新更新