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类的引用类型静态变量
字符串常量池里的引用
本地方法栈中引用的对象
被同步锁持有的对象