关于Java堆内存和系统RAM

时间:2019-09-19 07:08:59

标签: java memory-management

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

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

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

我的Linux机器的RAM约为30gb。

我的问题是:

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

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

  3. 由于它处理大量数据,我可以在JVM中得到OUTomemory错误吗? 信息:该程序在带有负载均衡器的WLS服务器(2个节点)中启动。

请提出处理此类用例的最佳方法。

谢谢, 维杰

1 个答案:

答案 0 :(得分:0)

  1. 使用ProcessBuilder运行的程序具有其自己的虚拟地址空间。它不使用Java堆。即使您使用ProcessBuilder调用了另一个Java程序,它也将是具有自己的内存/堆的独立进程。
  2. 类似于top / atop / Windows taskmanager之类的东西,它显示您的所有进程。您的python进程应单独显示。
  3. 1。的答案应该清楚地表明python进程的内存与JVM是分开的,因此,如果实际用尽了物理(或虚拟)内存,则只会为Java进程获得OutOfMemory。如果您的python进程全部用完了,那当然会发生。

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

相关问题