`
piperzero
  • 浏览: 3471597 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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内存活动图如下:呈现锯齿状


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

怎么避免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


分享到:
评论

相关推荐

    memory analyzer 内存泄露

    java 内存泄露检测工具 MemoryAnalyzer 堆内存检测 tomcat内存泄露检测 jvm内存泄露检测

    ibm的java内存泄漏检测工具

    实际项目中用过,解决了问题,比较不错。 以前项目中aix中出现问题,生成dump文件,用该工具分析即可。

    Cloud_Foundry中Java应用集合类内存泄漏检测_叶瑞浩.caj

    本文基于针对集合类对象的内存泄漏检测方案实现了口oudFoundry云平台 中Java应用内存泄漏的检测,通过监控集合类对象的内存消耗和集合内元素的 使用情况,得出对象内存泄漏的可能性大小,...

    详解Android内存泄漏检测与MAT使用

    虽然JVM提供了自动垃圾回收机制,但是还是有很多情况会导致内存泄漏。 内存泄漏主要原因就是一个生命周期长的对象,持有了一个生命周期短的对象的引用。这样,会导致短的对象在该回收时候无法被回收。Android中...

    如何排查Java内存泄漏?看完我给跪了!

    这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品。让我解释一下。 当不必要地维护不再需要的对象引用时,会发生内存泄漏。这些泄漏很糟糕。首先,当...

    java内存泄露、溢出检查方法和工具

    本作者项目原创经历,内容关于java的一个web项目内存溢出的分析和解决,其中详细介绍了诊断的方法和一些工具的使用,重点写了利用Eclipse Memory Analyzer 分析工具来分析jvm的堆快照。很有实用价值。

    实战Hot Spot JVM GC

    在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,...通过本文可以方便的检查你的代码是否存在内存泄漏。

    检测was运行中的内存溢出问题

    该文档整合了网上所有的关于描述was(webSphere)下生成许多phd文件的...产生该类文件的原因包括JVM设置的最小内存太小,以至于内存溢出,还有就是程序漏洞,使得JVM内存溢出,文档中叶介绍了websphere的检测工具的使用

    leak-watcher-1.0.0-sources.jar

    leak-watcher-1.0.0-sources.jar,JVM内存泄漏检测,

    weblogic定期故障分析

    在重新调整JVM为1G的情况下,分析了内存再次溢出的DUMP文件,从下图看出有存内存泄漏问题,而且情况较为严重,一个class共消耗内存670M,这个泄漏对象当前正在进行JDBC数据访问操作。 在JVM为1G的条件下,根据分析...

    基于javatcpsocket通信的拆包和装包源码-Interview-questions:面试问题

    基于java tcp socket通信的拆包和装包源码 ...检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。 如果一个

    2018百度西交大大数据竞赛-商家招牌的分类与检测-初赛.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    精通并发与netty视频教程(2018)视频教程

    84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器详解 86_Netty自定义编解码器与TCP粘包拆包问题 87_Netty编解码器执行流程深入分析 88_ReplayingDecoder源码分析与特性解读 89_...

    DC竞赛轴承故障检测.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    精通并发与 netty 视频教程(2018)视频教程

    82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器...

    AI challenger竞赛hourglass用于关键点检测.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    PRCV2021变化检测竞赛第三名解决方案.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    精通并发与netty 无加密视频

    第84讲:Netty引用计数注意事项与内存泄露检测方式 第85讲:Netty编解码器剖析与入站出站处理器详解 第86讲:Netty自定义编解码器与TCP粘包拆包问题 第87讲:Netty编解码器执行流程深入分析 第88讲:...

    常见的java面试题及解答

    垃圾回收机制可以有效地避免内存泄漏问题。 Java中什么是反射? 反射在Java中是指在运行时动态地获取类的信息,并可以动态地创建和调用对象。通过反射,可以访问类的属性和方法,甚至可以修改类的行为。反射在Java中...

    JAVA面试题集合面试技能大全

    垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的...

Global site tag (gtag.js) - Google Analytics