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)
在这里插入图片描述
jvisualvm //位于jdk的bin目录下(jvisualvm.exe)
在这里插入图片描述
jprofile //可自行百度查看
可以根据java的gc来查看内存对象的引用,然后根据gc可达性来使你的对象满足gc从而被释放
在这里插入图片描述

2:针对堆外内存的查看工具
对于jvm本身使用的堆外内存,也就是用过unsafe进行创建的,可以通过jvisualvm 查看。
在这里插入图片描述
对于使用native造成的内存问题可以使用google的工具进行查看google-perftools
这个工具笔者仅看到在linux下的版本,主要就是替换了malloc的动态库然后统计的

dump文件查看工具
上面的jprofile可以查看dump文件,还有eclipse memory analyzer
在这里插入图片描述

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值