我有一个在Java8和Tomcat 8.5中运行的应用程序。我正在针对它进行测试,我认为这会发生内存泄漏,好像我运行一系列POST(REST调用将数据推送到db)一样,我收到“ java.lang.OutOfMemoryError:超出GC开销限制”错误。目前,我几乎使用了所有默认值。我正在做的职位并不多,每个职位之间我要留出3秒钟的间隔。
我注意到默认的Tomcat JVM内存大小非常小(开始时为126,最大为252)。当我使用jconsole进行连接时,它始终显示“ PS Old Gen”已全部用尽,幸存者空间移动不大,伊甸园空间上下波动,但在出现错误之前达到了99%/ 100%。如果我使用tomcat8w.exe将内存大量增加到2 GB,问题将“消失”。
我要努力理解的是如何确定是否存在内存泄漏,或者仅仅是系统需要分配更多的内存?
如果我的错误是由Eden Space击中100%引起的,那么这并不意味着没有内存泄漏,因为这大概意味着对象挂了足够长的时间,可以在堆周围向上移动,应该是'PS Old Gen '这正在填满,还是JVM可能失去了对对象的跟踪,因此它们填满了Eden Space,却再也无法移动?
答案 0 :(得分:0)
如果我使用tomcat8w.exe将内存大量增加到2 GB,问题将“消失”。
使用此限制,并持续监视系统几天。如果老年代的占用量在主要收集之后(即常见的跷跷板模式的峰值)稳定在某个值,那么这可能不是泄漏。 如果老一代乘用车高峰持续攀升,可能是泄漏。