Ubuntu 上的 Java 进程一直被某些东西杀死,有人知道为什么吗?

2024-01-05

所以每隔几天我在 Ubuntu 上的 java 进程就会自动终止,我不明白为什么。

我的盒子有 35.84 GB 的 RAM,当我启动 Java 进程时,我向它传递了 -Xmx28g 参数,因此它使用的内存应该小于可用的最大 RAM。

我运行 jstat 如下:

# jstat -gccause -t `pgrep java` 60000

在进程被终止之前 jstat 的最后几行输出是:

Time     S0     S1     E      O      P       YGC   YGCT       FGC FGCT     GCT     LGCC                 GCC
14236.1  99.98   0.00  69.80  99.40  49.88   1011  232.305    11  171.041  403.347 unknown GCCause      No GC
14296.2  93.02   0.00  65.79  99.43  49.88   1015  233.000    11  171.041  404.041 unknown GCCause      No GC
14356.1  79.20   0.00  80.50  99.55  49.88   1019  233.945    11  171.041  404.986 unknown GCCause      No GC
14416.2   0.00  99.98  24.32  99.64  49.88   1024  234.945    11  171.041  405.987 unknown GCCause      No GC

这似乎是此时 /var/log/syslog 中记录的内容:https://gist.github.com/1369135 https://gist.github.com/1369135

除了我的 java 应用程序之外,该服务器上实际上没有任何东西在运行。这是怎么回事?

edit:我正在运行java版本1.6.0_20,我在启动时传递给java的唯一值得注意的参数是“-server -Xmx28g”。我没有使用应用程序服务器,但我的应用程序嵌入了“简单网络框架”。


假设问题是 OOM 杀手,那么它就会杀死你的进程,拼命地试图让操作系统在严重的内存短缺危机中保持正常运行。

我的结论是:

  • 您的 JVM 实际上使用的内存明显超过 28Gb;即您有大量的非堆内存使用,并且

  • 操作系统未配置足够的交换空间。

我会尝试添加更多交换空间,以便操作系统可以在紧急情况下交换应用程序的部分内容。

或者,减小 JVM 的堆大小。


请注意,“-Xmx ...”设置最大堆大小,而不是 JVM 可以使用的最大内存量。 JVM 将一些东西放在堆之外,包括线程堆栈的内存和应用程序正在使用的内存映射文件。


系统日志证实它是 OOM 杀手。

链接的系统日志以什么方式这么说?

它是这样说的:

Nov 15 13:53:49 ip-10-71-94-36 kernel: [3707038.606133] Out of memory: kill process 6368 (run.sh) score 4747288 or a child
Nov 15 13:53:49 ip-10-71-94-36 kernel: [3707038.606146] Killed process 9359 (java)

控制台说java被杀死了,而不是它退出了。

正确的。它被操作系统的 OOM 杀手杀死了。

如果内存不足,它通常会抛出 OutOfMemory 异常,但事实并非如此。

如果您填满了 Java 堆,就会发生这种情况。

这不是这里发生的事情。实际问题是没有足够的物理 RAM 来容纳 Java 堆。 OOM 杀手会处理它......

我正在运行如此巨大的堆,因为我需要存储数百万个对象,每个对象都需要几千字节的 RAM。

不幸的是,您尝试使用的 RAM 远多于系统可用的 RAM。这会导致虚拟内存崩溃,影响整个操作系统。

当系统开始严重抖动时,OOM 杀手(而不是 JVM)会将您的 Java 进程识别为问题的原因。然后它会杀死它(使用 SIGKILL)以保护系统的其余部分。如果没有,则存在整个系统完全锁定并需要硬重启的风险。


最后,你说:

我的盒子有 35.84 GB RAM ...

这是一个相当奇怪的值。 32 GiB 是 34,359,738,368 字节或 34.35 GB。

但基于这一点和观察到的行为,我怀疑那是可用的虚拟内存而不是物理 RAM。或者,您的“盒子”可以是在虚拟机管理程序级别启用 RAM 过度使用的虚拟机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu 上的 Java 进程一直被某些东西杀死,有人知道为什么吗? 的相关文章

随机推荐

  • 让 MATLAB Mex 搜索特定文件夹中的库

    我创建了一个 mex 函数 它依赖于一个依赖于另一个库的库 当我执行该函数时 它在运行时输出以下错误 Invalid MEX file Library not loaded usr local lib libgomp 1 dylib 我的计
  • WPF 检查系统上是否安装了 python

    我的 wpf 应用程序调用 python 脚本来生成输出 稍后显示在 UI 中 如果用户系统上未安装 python 为了避免应用程序崩溃 我需要执行检查 目前我已经使用以下方法实现了这一点 ProcessStartInfo start ne
  • Groovy 重写compareTo

    我正在使用 Groovy 类别在 DSL 下工作 我需要覆盖 重载 操作员 然而却是已知问题 http jira codehaus org browse GROOVY 3364 当类实现Comparable Groovy 会调用compar
  • ORA-01830: 日期格式图片在转换整个输入字符串之前结束

    SQL 在大多数安装上都可以正常工作 但是 我在加拿大安装 Oracle 时遇到问题 可能是日期本地化问题 http www google com search q ORA 01830 http www google com search
  • 如何在 C 中将 double 转换为 int?

    double a a 3669 0 int b b a 我在 b 中得到 3668 而不是 3669 我该如何解决这个问题 如果有 3559 8 这样的我也想要 3559 而不是 3560 我怀疑你不知道actually有这个问题 我怀疑你
  • 同义词分析器不工作

    这是我的设置 countries aliases mappings country properties countryName type string settings index creation date 1472140045116
  • (Perl) 从文件读取字符串时是否可以插入变量?

    我正在编写一个脚本 其中有一些变量传递给字符串 然后将它们打印出来 初始字符串只有 6 行 我不需要外部文件 但现在我有了一个可以填充 1000 多行的新字符串 新字符串还有一些字段将被脚本中声明的变量替换 文本文件内容如下 Hello n
  • 如何在 Android 中以编程方式锁定屏幕? [复制]

    这个问题在这里已经有答案了 可能的重复 以编程方式锁定 Android 设备 https stackoverflow com questions 4545079 lock the android device programatically
  • 在 Docker 中向 Golang 应用程序发送信号

    我正在尝试在 docker 容器内运行用 golang 编写的服务器 例如 package main import net http func main http HandleFunc func w http ResponseWriter
  • Javascript 从 UIWebView 调用 Swift

    我正在尝试从 UIWebView 中的 javascript 函数调用 iOS 10 中的 Swift 我设置了一个非常基本的项目只是为了尝试使其正常工作 代码如下 import UIKit class ViewController UIV
  • django 变量可用于所有视图

    使用 context processors 可以轻松定义一个可调用的结果变量可供所有模板使用 是否有任何类似的技术可以使变量可用于所有视图 这有可能吗 也许有一些解决方法 姜戈 2 2 蟒蛇 3 5 3 您可能想要实现自定义中间件 http
  • 如何终止 Neo4j 中当前长时间运行的查询

    如何终止 Neo4j 中当前长时间运行的查询 无需重新启动服务器 我知道我们可以在全球范围内设置查询超时 https groups google com forum topic neo4j 5ec8FThLTeo 但有时我想在服务器上执行繁
  • vbs安静而优雅的taskkill所有chrome进程

    这段代码有什么办法吗 Dim oShell Set oShell WScript CreateObject WScript Shell oShell Run taskkill im chrome exe 0 True 我希望它关闭所有正在运
  • 如何在ajax中调用Struts2 Action方法?

    如何在ajax中调用Struts2 Action方法 现在我仍然在调用servlet 有没有可能 如果有请分享 更新struts xml as
  • Gtk ComboBox 宽度基于内容

    我正在动态地将选项填充到具有条目的 GTK3 ComboBox 有些选项可能会很长 如果我的模型中有宽的项目 我希望能够使组合框更宽 有没有办法做到这一点 如果组合框可以自动扩展但可以设置上限 那就太好了 None
  • 鼠标滚轮事件与悬停控件一起使用

    在我的 C 3 5 Windows 窗体应用程序中 我有一些 SplitContainer 每个内部都有一个列表控件 停靠填充 当焦点位于这些控件之一并且我移动鼠标滚轮时 现在获得焦点的列表会滚动 我的任务是滚动当前由鼠标悬停的列表 而不是
  • neo4j 和 max 打开文件

    我在 ubuntu 上使用 neo4j 1 8M06 当我启动它时 我收到此警告 WARNING Max 1024 open files allowed minimum of 40 000 recommended 这是什么意思 如果需要的话
  • WordPress 函数获取帖子的顶级类别?

    您好 我正在尝试找到帖子的最高类别 我尝试查找任何 WP 内置函数 但失败了 例如我有这样的类别 Parent sub 1 sub 2 我在 sub 2 中有一个帖子 因此 使用 sub 2 的 ID 我试图找到本例中名为 Parent 的
  • PHP 中是否有 Java HashMap 等效项?

    我需要类似于Java中的HashMap的PHP对象 但我在谷歌搜索时没有找到 所以如果有人知道我如何在PHP中模仿HashMap 我们将不胜感激 PHP 中的数组可以具有键值结构
  • Ubuntu 上的 Java 进程一直被某些东西杀死,有人知道为什么吗?

    所以每隔几天我在 Ubuntu 上的 java 进程就会自动终止 我不明白为什么 我的盒子有 35 84 GB 的 RAM 当我启动 Java 进程时 我向它传递了 Xmx28g 参数 因此它使用的内存应该小于可用的最大 RAM 我运行 j