【问题标题】:Finding who (what) killed my process找出谁(什么)杀死了我的进程
【发布时间】:2012-12-01 12:58:37
【问题描述】:

当我从 bash 脚本运行我的 java 程序时,有时我会收到一条消息:

MyProgram.bash: line 30:  4388 Killed

我将 bash 的参数设为最大值:

ulimit -Ss unlimited
ulimit -Sc unlimited
ulimit -Sn 4096

但是当我在执行后按 CTRL+C 时,我有这个错误:

OpenJDK 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated

我添加此信息,当我在另一台机器上运行具有相同参数的相同程序时,我没有此异常! 我用这些参数运行我的程序(我的内存中有 5Go)

jvmargs="-d64 -Xms512m -Xmx3G -Xss1G"

我的算法占用大量内存,因为我使用序列化。那么为什么我杀死了消息,而不是 OutOfMemoryError 的例外?我能做些什么来解决问题?为什么当我在另一台具有相同参数的机器上运行时它可以工作?

【问题讨论】:

    标签: java linux process signals kill


    【解决方案1】:

    重读该错误消息:

    OpenJDK 64 位服务器 VM 警告:发生异常 java.lang.OutOfMemoryError 将信号 SIGINT 发送到处理程序 - 可能需要强制终止 VM

    如果OpenJDK不能正确处理中断信号(因为它完全内存不足),它可能会诉诸于杀死自己

    【讨论】:

    • 但是为什么当我在另一台机器上运行具有相同参数的相同程序时,它可以工作?
    • 也许这两个虚拟机有区别?
    • 它们的内存量是否相同。
    【解决方案2】:

    如果一个进程因为内存不足、Segfault 或其他导致 Linux 杀死它的原因而被杀死,你会在 dmesg 和/或 /var/log/dmesg 或 /var/ 中找到带有堆栈跟踪的问题描述日志/消息日志文件。尝试在 linux 控制台输入 dmesg。

    # dmesg
    [4374940.147496] php-fpm[15522]: segfault at 10000004d8 ip 00000010000004d8 sp 00007ffff9d41428 error 14 in libnss_dns.so.2[7ffe4d5a1000+5000]
    [4375020.428429] soffice.bin[23336]: segfault at 48 ip 00007f8d63c566c0 sp 00007ffff529cc88 error 4 in libsvllo.so[7f8d63bb1000+108000]
    

    【讨论】:

    • dmesg 或消息或安全文件上没有任何内容,但我的 java 应用程序被操作系统杀死。这可能是什么原因? PS:我的服务器在 Centos OS 上运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2016-03-13
    • 2020-01-10
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多