Java堆内存溢出学习笔记20230502

Java内存溢出异常测试:

Java堆作用:用于存储对象实例

不断创建对象保证GCRoot到对象之间有路径避免垃圾回收机制回收这些对象对象逐渐增多,容量大于最大堆容量,产生内存溢出异常。

如下所示java堆限制大小为20M,不可扩展,-XX:+HeapDumpOnOutOfMemoryError

可让虚拟机出现异常时dump出当前堆内存转储快照

约10分钟后堆内存出现OutOfMemoryError异常进一步提示Java heap space

生成堆转储快照方法:

1)

jmap命令,用于生成转储快照但不仅于获取快照

jmap -head <PID>

jmap -dump:format=b,file=xxx <pid>

2)

通过-XX:+HeapDumpOnCtrlBreak参数可以使用Ctrl+Break生成堆转储快照

3)

jstack <pid>

4)

如果不使用上述方法生成,还有一种简单粗暴的方法,Linux下通过kill -3 恐吓虚拟机重定向至日志文件也可实现

dump分析工具:

Java线程Dump分析工具fastThread:

Smart Java thread dump analyzer - thread dump analysis in seconds

使用dump分析工具进行分析,查找内存泄露与死锁进程。

当服务器挂起,崩溃时,就需要抓取服务器dump日志进行分析. 在实际运行中,往往一次 dump的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threaddump,每次间隔10-20s,多次截取日志。

线程处于各种生命周期的总数;

状态百分比,有没有死锁的;

databus cas服务

守护线程与非守护线程的比例

阻塞线程-传递图

GC 线程

虚拟机性能监控工具:

Jps虚拟机进程状况工具:

-m 输出虚拟机进程启动时纯递给主类main()函数的参数

-l  输出主类的全名,进程执行的是jar包输出jar路径

-v  输出虚拟机进程时的JVM参数

Jstat虚拟机统计信息监视工具:

-class  监视类加载、卸载数量、总空间以及类装载所耗时间

-gc    监视java堆状况,Eden分区,两个Survivor区,老年代,永久代容量,使用空间,垃圾收集时间(./jstat -gc <PID> 1000 20)

-gccapacity  监视内容于-gc大致相同但输出主要关注java堆各个区域使用到的最大与最小空间

-gcutil  监视内容于-gc大致相同但输出主要关注已使用空间占总空间的百分比

-gcnew  监视新生代垃圾收集状况

-gcold  监视老年代垃圾收集状况

-gcpermcapacity  输出永久代使用到的最大、最小空间

-compiler  输出即时编译器编译过的方法、耗时等

-printcompilation  输出已经被即时编译的方法

Jinfo java配置信息工具

Jmap java内存映像工具

-dump  生成java堆转储快照

-finalizerinfo  显示在F-Queue中等待Finalizer线程Finalizer方法的对象

-heap  显示java堆详细信息,参数配置,分代状况

-histo  显示堆中对象统计信息,包括类实例数量,合计容量

-permstat  以ClassLoader为统计口径显示永久代内存状态

-F  当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照

Jhat 虚拟机转储快照分析工具

Jstack java堆栈跟踪工具

-F  当正常的输出的请求不被响应时,强制输出线程堆栈

-l  除堆栈外,显示关于锁的附加信息

Java对象判断是否存活,以便于垃圾收集

引用数据算法:

在对象创建之初,在对象中添加一个引用计数器,每有一个地方引用时,计数器加一,引

用失效时,计数器减一,计数器为零时对象不可在被使用。

优点:

原理简单

判定效率高

缺点:

占用额外内存空间

需配合大量的额外处理,对象间相互引用互相循环问题无法解决

可达性分析算法:

通过根节点(GCRoot)作为节点集,根据引用关系向下搜索,查看·下属对象是否可达,如果不可达说明对象不再被使用,进而对其回收。

GC Roots 对象选择:

当前正在运行的方法,变量等

Java类的引用类型静态变量

字符串常量池里的引用

本地方法栈中引用的对象

被同步锁持有的对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值