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

相关文章
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
5天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
7天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
25 6
|
3天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
7 1
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
56 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
16天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
113 9
|
16天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
34 6
|
1月前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
22天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
45 10
|
19天前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。