【问题标题】:Regarding java heap memory and system RAM关于java堆内存和系统RAM
【发布时间】:2019-09-19 07:08:59
【问题描述】:
我正在使用进程构建器从 java 执行 python 程序。创建了一个 shell 脚本文件,其中设置了一些环境变量,然后执行 python 脚本。
Process p = Runtime.getRuntime().exec(executeAutoML.sh);
包含上述代码块的类将从 Java 调度程序 (ScheduledExecutorService) 中调用。
我的 Linux 机器有大约 30GB 内存。
我的问题是:
python 脚本用于分析目的。它将创建一些巨大的数据框来处理数据。假设最大数据帧大小为 (100 万 x 100 )。 它可以使用系统 RAM 或 JVM 堆吗?
如果它使用系统 RAM,那么我如何查看 RAM 消耗?
当它处理大量数据时,我会在 JVM 中得到 OUTomemory 错误吗?
信息:此程序在带有负载平衡器的 WLS 服务器(2 个节点)中启动。
请建议处理此类用例的最佳方法。
谢谢,
维杰
【问题讨论】:
标签:
java
memory-management
【解决方案1】:
- 使用 ProcessBuilder 运行的程序有自己的虚拟地址空间。它不使用 Java 堆。即使您使用 ProcessBuilder 调用另一个 Java 程序,它也将是一个具有自己的内存/堆的单独进程。
- 诸如
top/atop/ Windows 任务管理器之类的东西会显示您的所有进程。您的 python 进程应该单独出现。
- 1. 的答案应该清楚地表明,python 进程的内存与 JVM 是分开的,因此如果您实际上用尽了物理(或者更确切地说是虚拟)内存,您只会获得 Java 进程的 OutOfMemory。如果你的 python 进程用完了它,当然会发生这种情况。
一般来说,对于如此庞大的数据任务,您需要仔细检查是否可以分批处理数据,而不是一次性处理所有数据。例如,如果您对不需要信息/影响其他行的数据行进行操作,那么您可以逐行加载,处理每一行,然后在处理下一行之前将其写入结果文件。这样可以避免一次加载所有数据。