【问题标题】: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 内存。

我的问题是:

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

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

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

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

谢谢, 维杰

【问题讨论】:

    标签: java memory-management


    【解决方案1】:
    1. 使用 ProcessBuilder 运行的程序有自己的虚拟地址空间。它不使用 Java 堆。即使您使用 ProcessBuilder 调用另一个 Java 程序,它也将是一个具有自己的内存/堆的单独进程。
    2. 诸如top/atop/ Windows 任务管理器之类的东西会显示您的所有进程。您的 python 进程应该单独出现。
    3. 1. 的答案应该清楚地表明,python 进程的内存与 JVM 是分开的,因此如果您实际上用尽了物理(或者更确切地说是虚拟)内存,您只会获得 Java 进程的 OutOfMemory。如果你的 python 进程用完了它,当然会发生这种情况。

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

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2014-03-05
      • 2012-03-08
      • 2021-10-02
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多