1 JVM 基础
1.1 jvm jre jdk
jvm < jre < jdk
jvm : java虚拟机
jre:java运行环境
jdk:java开发工具包
1.2 jvm 的划分 模型
程序计数器:记录每个线程执行到了多少行。
一个线程具有一个虚拟机栈。
1.3 jdk1.7 jdk1.8内存划分上的区别
1.7 的方法区:被称为永久代,放于堆当中。
1.8 的方法区:被称为元空间,在物理内存中,但是在物理内存中只有 字节码文件和静态变量,常量还是存于堆当中。
1.4 串池的数据结构是什么,怎么优化串池
串池:也称为常量池,数据结构为hashmap
优化hashmap:减少hash碰撞 和 内存占用达到平衡。
1.5 怎么查找死锁问题,线程死锁
用什么工具:
jps:查找系统中正在运行的java代码。
jstack:查找java进程中的线程情况。
jvisualvm:windows下的java图形控制界面。
1.6 栈、堆内存的空间是不是越大越好
- 栈内存的空间不能太大,因为一个线程会有一个栈,而java是多线程的,故当栈大而多的时候会非常占内存。
- 堆内存的空间是越大越好,因为堆空间是线程共有的。
1.7 堆的内存划分
默认比例
- 新生代:老生代 = 1:2
- 伊甸区:form:to = 8:1:1
1.8 垃圾产生的过程
- 每次oldgc之前必然会有 younggc,所以说oldgc就是fullgc
- OOM之前必然会有fullgc
1.9 怎么判断对象是一个垃圾
- 引用计数法:当在堆中的对象被栈引用时 +1,被释放时 -1.
- gcroot 可达性分析算法,通俗的说就是上头有人。是JVM使用的。
1.10 引用计数法的缺点是什么,为什么JVM不用
缺点:它很难解决对象之间的相互循环引用的问题,
1.11 哪些东西可以作为 gcroot
- 栈中的变量
- 常量
- 元空间的字节码和静态变量
1.12常见的垃圾回收算法以及特征
1.12.1 标记清除
- 优点:比标记整理较快
- 缺点:内存碎片化,不完整
1.12.2 标记整理
1.12.3 复制算法
1.12.4 分代收集法
- 新生代:使用 复制算法
- 老生代:使用 标记清除 或者 标记整理
1.13 常见的垃圾回收器 以及 组合 和特征
1.13.1 垃圾回收器
1.13.2 组合
- SS :串行,CPU是单核的服务器,选择使用这种组合
- PP:并行,jdk1.8 默选择的垃圾回收器,吞吐量大,一次fullgc把所有的垃圾都回收掉。
-
PC:并发,特征是低时延。
cms一次回收的过程:
- 初始化,有短暂的stw()【stop the world】,只会标记表面的垃圾。
- 并发标记,标记剩下来的垃圾。
- 重新标记,重新标记新产生的垃圾。
- 并发清理
缺点:
- 标记清除算法,会产生碎片。
- cms会产生浮动垃圾,所以我们在使用cms垃圾回收器的时候,在老生代要预留8%的默认空间(可以修改),但是如果一次产生的浮动垃圾大于预留空间,那么会产生并发模式失败的错误。此时将回退到串行垃圾回收器。
-
G1
特点:
- 兼顾了底时延和高吞吐的垃圾回收器
- 使用标记整理,不会产生碎片垃圾。
垃圾回收过程:
- 初始标记
- 并发标记
- 重新标记
- 筛选回收
2 JVM的参数
参数放于:Edit Configurations... --- > Program arguments
或使用java -jar Xxx.jar + 参数
2.1 常见参数:
-
是否打印收集到的细节
-XX:-PrintGCDetails
-XX:+PrintGCDetails
-
栈内存大小 默认1M
-XX:ThreadStackSize=1024k
一般简写为:-Xss=1024k
-
初始化堆大小
-XX:InittailHeepSize=10M
一般简写为:-Xms=10M 默认是物理内存的 1/64
-
最大堆大小
-XX:MaxHeepSize=10M
一般简写为:-Xmx=10M 默认是物理内存的 1/4
-
新生代大小
-XXm2g
-
设置元空间大小
-XX:MetaspaceSize=512m
-
设置新生代:老生代
-XX:NewRatio=n
-
设置新生代伊甸园区与两个幸存者区比
-XX:SurvivorRation=n
2.2 使用垃圾搜集器
-XX:+UseSerialGC
:设置串行收集器-XX:+UseParallelGC
:设置并行收集器-XX:+UseParalledlOldGC
:设置并行老年代收集器-XX:+UseConcMarkSweepGC
:设置并发收集器-XX:+UseG1GC
:G1收集器
并行收集器设置:
- -XX:ParallelGCThreads=n:设置并行收集器使用的CPU个数,并行收集器线程数
- -XX:MaxGCPauseMillis=n:设置并线搜集器的最大暂停时间
并发垃圾回收期:
-XX:ParallelGCThreads=n
生成dump文件:
堆转储JVM内存中某一时刻所以对象的快照。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dumps 在OOM的时候产生dump快照文件
3 工具
3.1哪些场景需要调优?
- OutOfMemoryException 内存不足,溢出。
- 线程死锁
- cpu占用很高,自旋 或者 频繁fullgc
3.2 jvm 调优小工具
jmap -dump:format=b,file=/opt/dump/test.dump {PID}
3.3 曾经的四大工具
现在:
1,使用skywalking
查看线程问题,是网络?mysql? 还是方法出了问题。
2,如果是方法出了问题,再使用阿里巴巴的阿尔萨斯(Arthas)
查看是方法的那一行出现了问题。