一、JVM是什么
二、JVM组成部分
三、各组成部分介绍
1.程序计数器
2.堆
jdk7和jdk8堆的区别
3.栈
垃圾回收是否涉及栈内存
局部变量是否线程安全
栈内存溢出
4.堆栈的区别
1.堆和栈是两种不同的数据结构
栈是一种先进后出的数据结构,堆的数据结构是二叉树
5.方法区
四、类加载器
一般用前三种,自定义加载器用的较少
1.双亲委派机制
2.为什么采用双亲委派机制
3.类加载的全过程
加载
验证
准备
解析
初始化
使用
卸载
五、垃圾回收
1.什么时候被回收
2.定位垃圾两种方式
引用计数法
循环引用,内存泄漏
可达性分析算法
3.垃圾回收算法
4.分代回收
5.垃圾回收器(4种)
6.强引用、软引用、弱引用、虚引用
六、JVM实践
1.什么情况使用JVM调优
内存使用率过高,出现OOM溢出,首先排除代码问题(1.创建了大量的对象,比如死循环创建对象;2.有一些大对象(sql查询未做分页,都放到list中);3.出现内存泄漏,对象不能被GC回收),其次可以调整堆或原空间的大小
stw时间太长,可以考虑换一个垃圾回收器
频繁的full gc,1.可以考虑调整老年代大小;2.调整年轻代大小:系统一次加载过多数据到内存(比如sql查询未做分页),导致大对象进入了老年代;3.内存泄漏导致
2.调优设置
3.参数设置
堆
栈
垃圾回收器
4.调优命令、工具
jmap -heap pid查看堆内存信息
jmap -histo pid查看堆中对象的统计信息:对象数量、占用内存大小
jmap -histo:live pid只计算活动的对象
jmap -dump:[live,]format=b,file=
生成Java虚拟机的堆转储快照dump文件。具体说明如下:
live参数是可选的,如果指定,则只转储堆中的活动对象;
format=b表示以hprof二进制格式转储Java堆的内存。
file=<filename>用于指定快照dump文件的文件名。
jstat -gc pid 5000(5秒查看一次)用于查看JVM中堆的垃圾收集情况的统计
5.内存泄漏排查(内存飙高)
内存泄漏产生原因
像数据库连接,IO,Socket等连接,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。
怎么排除
jstat查看垃圾回收情况
GC之后垃圾正常回收,可能就是别的一些原因(比如并发量突然高了),如果没有回收掉老年代的垃圾,可能产生内存泄漏。
jmap命令查看占用内存大的对象
dump文件
6.CPU飙高排查
死循环会导致CPU飙高
7.OOM后程序是否挂了
OOM程序没有挂,只是当前线程挂了,其他线程还能不能运行,取决于OOM的进程内存有没有回收,比如:全局变量是bean所持有的,程序不关就一直存在,内存就不会释放
如果是成员变量,OOM后则会释放内存