【问题标题】:If a Java process is killed in Unix(Solaris)/Windows is the memory used released?如果 Java 进程在 Unix(Solaris)/Windows 中被杀死,使用的内存是否被释放?
【发布时间】: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


【解决方案1】:

Java 垃圾收集器作为 Java 进程的一部分运行(实际上作为一个或多个线程),以管理操作系统分配的空间的使用情况。一旦您终止进程,所有这些都会停止,并且分配给该进程的内存将被释放,就像任何其他进程一样。

您无需重新启动或执行任何其他操作。

【讨论】:

    【解决方案2】:

    如果你杀死进程,Java 的 GC 就不再需要打扰了。无论GC如何,进程分配的任何内存都会被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多