JAVA内存泄漏问题出现原因及解决分析方案整理

时间记录:2019-6-13
java的内存泄漏问题是十分常见的,一般情况下的内存泄漏都是在堆内的,还有部分情况下是堆外的内存泄漏,这部分的内存泄漏并不好勘察,当然了也是有方法进行勘察的。笔者在进行压力测试的时候发现了内存泄漏的情况,并进行了问题的查找,属于堆外部分的内存泄漏,主要是在malloc分配内存的时候没有free,导致内存泄漏。

堆内内存
堆内内存通常指的是jvm 虚拟机指定的内存,可以理解为这个虚拟机系统本身分配的内存大小,可以的对比操作系统的内存。

堆外内存
堆外内存指的是虚拟机外的内存且不受垃圾回收机制直接控制,直接属于操作系统控制,也叫直接内存,在java中常用的在DirectBuffer上面,全部的操作都是由unsafe内操作的

堆内内存溢出和泄漏

java中的内存溢出分为两种,一种叫StackOverflowError,另一种叫OutOfMemoryError,两种都是在不同的情况下才会发生的。
StatckOverflowError 如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量,此问题会出现
OutOfMemoryError 如果java虚拟机栈可以动态扩展情况下,在尝试扩展时候无法申请到足够内存会发生;在创建新的线程时没有足够内存去创建虚拟机栈,也会发生这个情况;
这两种的内存溢出都会导致程序的溢出,而内存泄漏不会导致异常(在不超过操作系统本身的内存下),只是程序占用的资源过多。通常是在编写代码的时候不注意内存的释放,就是指没有触发GC(垃圾回收机制)的条件。

堆外内存泄漏

堆外内存其实和堆内内存的情况是差不多的,只是在对应的位置不一样而已,堆外内存泄漏,在使用了DirectBuffer和Native等情况造成内存泄漏,也就是代码不够规范造成的。

对于内存泄漏和内存溢出的根本就是在于自己代码写的不够好,没有其他原因,具体什么情况下会发生就不具体举例,主要看有哪些的工具

常用的勘察工具
勘察工具一般都是在jvm提供的接口查看虚拟机的信息,或者是将某些操作替换接管,不影响正常的程序运行。

1:针对堆内内存的查看工具
jmc //位于jdk的bin目录下(jmc.exe)
JAVA内存泄漏问题出现原因及解决分析方案整理_第1张图片
jvisualvm //位于jdk的bin目录下(jvisualvm.exe)
JAVA内存泄漏问题出现原因及解决分析方案整理_第2张图片
jprofile //可自行百度查看
可以根据java的gc来查看内存对象的引用,然后根据gc可达性来使你的对象满足gc从而被释放
JAVA内存泄漏问题出现原因及解决分析方案整理_第3张图片

2:针对堆外内存的查看工具
对于jvm本身使用的堆外内存,也就是用过unsafe进行创建的,可以通过jvisualvm 查看。
JAVA内存泄漏问题出现原因及解决分析方案整理_第4张图片
对于使用native造成的内存问题可以使用google的工具进行查看google-perftools
这个工具笔者仅看到在linux下的版本,主要就是替换了malloc的动态库然后统计的

dump文件查看工具
上面的jprofile可以查看dump文件,还有eclipse memory analyzer
JAVA内存泄漏问题出现原因及解决分析方案整理_第5张图片

总结 内存泄漏和内存溢出都是代码的问题,内存泄漏会影响性能的,多碰到几次多使用下工具就能迅速的定位到问题。
时间记录:2019-7-5

你可能感兴趣的:(JAVA内存泄漏问题出现原因及解决分析方案整理)