我们有一个Java应用程序,通过运行Main函数启动,同时在Springboot中嵌入Jetty作为Web容器。我发现Java堆达到最大大小,但堆使用率很低,并且Java由于耗尽本地内存而被操作系统杀死。
在pmap中有许多64MB的内存。我转储了一些内存块,并在其中发现了许多日志。这些日志的时间各不相同,即使过了几天仍然存在于内存中。例如:
在pmap中有许多64MB的内存。我转储了一些内存块,并在其中发现了许多日志。这些日志的时间各不相同,即使过了几天仍然存在于内存中。例如:
2019-03-23T05:50:46,851 661258664 [xxxxxx] INFO
2019-03-27T06:00:12,040 1029308155 [xxxxxxxx] INFO .........
我们使用log4j2和slf4j作为日志工具。日志由名称以“qtp”开头的jetty线程打印。
我们设置了immediateFlush="false"
和 SizeBasedTriggeringPolicy size="10MB"
我不知道为什么日志内容不在堆内存中。是log4j2在缓存或写入日志时使用Java本机内存吗?log4j2会出现内存泄漏吗?
-XX:+PrintGCApplicationStoppedTime
标志来轻松验证HotSpot中的小型收集是停顿全局的。随着应用堆越来越大,存活对象越来越多,这正迅速成为一个重要问题。 - Remko Popma