【问题标题】:Why OutOfMemoryError does not generated?为什么没有生成 OutOfMemoryError?
【发布时间】:2012-06-25 20:01:44
【问题描述】:

我的 java 编写的应用程序在工作一段时间后被“杀死”。

Java 应用程序是在 Linux 下从 SH 脚本启动的,该脚本运行了一段时间。然后显示PID并说出“杀死”字样。

像这样:

runMyServer.sh: line 3: 3593 Killed         java -Xmx2024m -cp ...

系统日志中有关于内存不足事件的信息。所以看起来像是内存不足错误。

我的问题是:OutOfMemroyError 异常什么时候不能生成?

【问题讨论】:

  • 系统日志中的条目是什么样的?可以贴在这里吗?
  • 尝试在没有 .sh 脚本的情况下运行应用程序。我认为它是生成的,只是显示了。
  • @11684 当应用程序被“杀死”时,我该如何重现这种情况?
  • 请注意,如果 Java 堆已增长到其最大允许大小并且您仍然需要新对象的空间,您只会收到 OutOfMemoryError。相反,如果您的应用程序用完操作系统分配的内存空间,操作系统将终止该应用程序而不发出 Java 异常信号。
  • 我不想告诉你,但你会发现有很多事情是你无法控制的。

标签: java linux shell out-of-memory


【解决方案1】:

您的系统上的内存可能太少,或者运行的进程会占用所有内存和交换空间。当 GNU/Linux 内存不足时,它会杀死占用大量内存的进程。这基本上只是杀死进程,所以不是你的Java进程内存不足,而是操作系统。

【讨论】:

  • 如何防止系统杀死我的程序?为什么它不杀死其他东西?我有 6G,我的 Java 堆被限制为 2G。
  • @Dims 你有多少可用内存?是否有其他进程使用相同数量或更多的内存?基本上,内存/cpu 时间最长的进程会被杀死,因此内存越多,cpu 越少,被杀死的可能性就越大。你的java价格使用多少内存,它会比堆使用更多。这里有更多信息lwn.net/Articles/317814
  • 当然,我还有另一个进程,其中一个是我的,需要 3G。我知道我可能内存不足,但我想控制情况......
【解决方案2】:

为避免您的 java 应用程序被 OOM 杀手杀死,只需向您的系统添加足够的交换并禁用内存过度使用。

dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile               swap                    swap    defaults        0 0" >> /etc/fstab
echo 2 > /proc/sys/vm/overcommit_memory

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2020-08-05
    • 2011-04-03
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多