java内存泄漏-java内存泄漏检测工具
以下为译文
正如 Java 开发人员所知,Java 利用垃圾收集来自动保持应用程序内存的清洁和健康。 然而,有些人可能不知道的是,即使有垃圾回收,Java 中仍然可能存在内存泄漏的风险。 如果遇到如下错误码:
java.lang.OutOfMemoryError: Java heap space
如果确认内存分配不足,可以通过以下代码增加应用程序的可用内存:
java -Xms-Xmx
但是java内存泄漏,对于内存泄漏,这样做是治标不治本,只能起到缓解作用。
识别内存泄漏
在将程序部署到生产环境之前,需要检查内存泄漏。 这里可以通过垃圾回收器的指标进行初步判断。
如果GC后内存占用持续上升,那么可能存在内存泄漏问题,如上图,代码可上GitHub()查看。 但是现实中,内存如图Old Gen那样线性增加的可能性很小,如图Old Gen,GC挂起次数或者Eden Space和Survivor空间使用量都不足以判断内存泄漏。
缩小问题范围
有很多工具可以找出内存泄漏的原因,例如 JVisualVM 或 jStat。 这些工具是JDK自带的,大家可以随时使用。 除了识别一些常用的Java内部类外,还需要识别一些用户自定义例程。
性能优化
在日常的开发过程中,只要GC不影响性能,开发者是不会关注内存设置和配置的。 这样一来,就埋下了潜在的隐患:因为内存问题不仅限于溢出和泄漏java内存泄漏,GC时间过长也会导致这个问题。 例如下图中的GC占用了16%的CPU。
堆设置
太小的Heap会导致频繁的GC,所以场景不难想象:增加GC会消耗更多的CPU,同时在GC的时候JVM会被卡住,导致性能变差。 一般来说,如果Heap太小,GC时间虽然会缩短,但会变得更加频繁。
如果Heap太大,GC时间会很长。 GC并不经常发生,但一旦触发,VM就会被冻结很长时间。
因此,如果在这种情况下发生内存泄漏,GC会非常频繁或者需要特别长的时间,JVM最终会因为内存溢出而崩溃。
气相色谱版本
自 Java 6 以来,GC 发生了很大变化。Java 7 引入了 G1GC 作为 CMS GC 的替代方案,而在 Java 9 中,G1GC 已成为默认设置。 Java 8 中移除了 PermGen Space,之前存储在 PermGen Space 中的数据改为存储在本地内存或栈中。