【发布时间】:2016-08-11 12:52:59
【问题描述】:
我们有一个一直挂起的应用程序,它在 Java 上运行(通常在 Solaris 服务器上运行)。每次挂起时,我们都必须终止该进程。但是我们无法判断 Java 的垃圾收集器在进程被杀死后是否真的做任何事情。我们担心在此应用程序挂起时必须重新启动服务器以释放内存,以释放内存。
【问题讨论】:
-
如果你要杀死 JVM,就没有垃圾收集器了。
-
当你杀死一个进程时,所有进程分配的内存都会被释放。
-
@Juancho 听说因为JVM是用C写的,所以这个软件在退出前需要释放内存,否则内存不会被释放。那是大错特错了。唯一不会被释放的内存是共享内存,但前提是进程创建了shared memory segment(s)。请注意,严格的 Java 进程无法做到这一点。你有root权限吗?发布来自
echo ::memstat | mdb -k的输出。这将显示使用实际物理内存的内容。另外,pstack PID很有用。 -
这似乎是XY problem。您有一个挂起的进程-并且您假设它与内存相关,因此您要询问内存使用情况。真正的问题是进程挂起。
-
@SusanW 如果 OP 正在监视:运行
pstack PID几次,将PID替换为卡住进程的进程 ID。对卡住的 Java 进程执行此操作的最困难的部分是确定多个线程中的哪一个是卡住的(或多个),因为 Java 进程将有许多由 JVM 本身启动的线程,这些线程与您的代码。您需要找到运行代码的线程并查看它们实际在做什么 - 或者它们被困在什么调用中。
标签: java unix memory solaris garbage