JVM内存泄漏检测与处理

简介: JVM内存泄漏检测与处理

JVM内存泄漏检测与处理(JVM Memory Leak detection and handling)

 

JVM垃圾回收机制的原则和方法

JVM垃圾回收中一个基本原则是对象没有被引用或则引用其它对象,换句话说当一个对象在heap


中是隔离(isolation)状态的时候,垃圾回收器就会自动回收分配给这个对象的堆内存空间。区分


活动对象的两个基本方法是引用计数器(reference counter)和跟踪(trace), JVM中垃圾回收器(GC)


的种类主要有以下:


Ø        吞吐量优先收集器(Throughput Collector) 一个并行版本的短时(YoungGeneration)收


       集器,使用参数为:-XX:+UseParallelGC


Ø        并发低中断收集器(Concurrent Low Pause Collector),在垃圾回收过程中应用程序将被


       短时挂起,使用参数为:-XX:UseConcMarkSweepGC


Ø        增量低中断收集器(Incremental Low Pause Collector),使用参数为:-Xincgc


Ø        此外,JDK 1.4以后支持自适应的垃圾回收器



怎么观察垃圾回收器的工作和详细信息,使用如下两个JVM参数即可:


-verbose:gc


-XX:+PrintGCDetails


另外一个很有用的JVM参数选项为: -Xprof打印CPU Profiling开销时间数据



JVM内存泄漏特征:


1.      程序在不断重复某个操作时,内存一直处于动态的增长之中,并且到达JVM声明的最大内


        存而不释放任何heap内存。


2.      某个流程已经处理完成,但是过程中增加的临时内存在介绍后却没有被垃圾回收


3.      应用程序运行一段时间以后就得到OOM(Out of Memory)异常

一个典型JVM内存活动图如下:呈现锯齿状

0_1313487860y7Pn.png

一个内存泄漏的JVM内存活动图如下:呈现阶梯状上升

0_1313487880fX3Z.png

怎么避免JVM内存泄漏:

1.      对象使用完以后记得将对象引用置为null, object_instance = null;


2.      退出或者关闭UI对象时,要remove注册的listeners


3.      对与swing的图形设备对象(Graphics)使用以后调用dispose() 方法释放资源


4.      对于HashMap对象要调用clearAll()方法在设置为null之前


5.      对于树形结构的数据对象, 一个通常的做法是定义一个通用的cleanup()/release()接口。


然后逐级调用cleanup()方法来完成对象引用的销毁(设置为Null)。


6.      避免创建重复信息的Data Model或者多个本地copy


7.      文件I/O与Hibernate的session用完以后要及时关闭释放资源


8.      对于socket的stream buffer空间,数据库连接要及时关闭


9.      回收和处理JNI分配的内存。



关于JVM垃圾回收的认知误区:


1.      当内存使用太多的时候,可以显式的调用System.gc()方法


答案是显式调用并不能解决此类问题,反而会因为反复调用System.gc()导致JVM性能问题,


更进一步的原因在于,即使显式调用JVM并不保证垃圾回收器立即运行。


推荐:无论什么时候,永远不要使用System.gc()来显式调用JVM垃圾回收器



2.      当对象不再被使用的时候,垃圾回收器就会自动回收它们


垃圾回收只会回收那些引用计数为零的对象instance,当一个对象的引用计数不为零或者


处于可以追溯状态是,垃圾回收器永远都不会回收这些堆内存,常见JVM内存泄漏都是由


这个原因引起的。



什么才是正确的处理方法:


1.      定义一个接口类 - MemHandler


2.      实现并完成cleanup()方法在你自己定义的对象classes中


3.      当应用程序不再使用该instance之前调用cleanup() 方法



参考引用:


http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html


http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

目录
打赏
0
相关文章
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
JVM简介—1.Java内存区域
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
22天前
|
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
23 6
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
39 1
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
653 166
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。