在堆转储上重启java进程

时间:2012-02-07 16:13:17

标签: java garbage-collection heap-memory

如果它产生任何内存问题,例如“超出GC开销限制”或“Java堆空间”,我需要重新启动它。 是否有一些标准方法可以像使用某些工具或选项一样。 如果不是,我怎么能把watchDog用来做这个。 我注意到,当这些问题发生时,我的过程不会停止。 重新启动会让它重新回到原点

4 个答案:

答案 0 :(得分:2)

这里有人会建议更好的选择,所以这只是我的0.02美元。我之前在某个应用程序上所做的是对一个Object有一个SoftReference,偶尔我会检查该Object是否为null。在您真正接近OutOfMemory之前,GC正在收集(通常,但不能保证)SoftReferences,因此会以某种方式告诉您,您真的接近失败。

此外,在这种情况下,您应该查看JVM选项:

  

-XX:SoftRefLRUPolicyMSPerMB = someValue中

其中'someValue'是每个空闲Mb内存的软引用保留的毫秒数。默认值为1s / Mb,因此如果一个对象只是软可达,如果只有1Mb的堆空间是空闲的,它将持续1秒

这可能不是最好的选择,但只是暗示可能是?

干杯,尤金。

答案 1 :(得分:0)

Runtime#freeMemory()将告诉您VM中有多少可用内存 - 您可以监视它并在达到阈值时发出警报。在那时调用System.gc()可以释放更多的内存,但它没有保证,应该被视为最后的手段。

你真的需要结合这一点,理解为什么你的记忆用完了,并试图做一些事情来解决它。

答案 2 :(得分:0)

您可以使用Tanuki Software Java Service Wrapper;它会处理Automatic customizable response when something happens in your application or JVM.

它有一个filter feature

  

过滤器是一个非常强大的功能,可以在不进行任何编码的情况下向现有应用程序添加新行为。它的工作原理是监视JVM的控制台输出以获取文本序列。当找到它们时,可以采取任何数量的行动。

     

示例是在发生特定错误时启动JVM重新启动。一些应用程序已经知道了一旦进入某个状态就会停止工作的错误。此功能可以立即解决此类问题,直到可以在应用程序中解决这些问题。

答案 3 :(得分:0)

假设您的Java应用程序在正常关闭时返回0,则下面的shell脚本可以担任监视程序的角色。

#!/bin/bash

...

while true; do
  java ... MyClass && break
done