JVM常见问题
Posted 若甘年后
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM常见问题相关的知识,希望对你有一定的参考价值。
JVM
1. jvm内存结构
- 线程共享
- 方法区 MetaSpace
- 运行时常量池
- 类的信息,包括类名、参数、方法等
- 类的常量
- 类的静态变量
- 堆 Heap
- 老年代 Old Space
- 新生代 Young Space
- Eden -8
- S1-1
- S2-1
- 方法区 MetaSpace
- 线程私有的
- 虚拟机栈
- 本地变量表
- 操作数栈
- 动态链接 一些动态生成的链接地址等,类似于符号引用变直接引用
- 返回地址(包括正常的和异常的)
- 本地方法栈
- 程序计数器
- 虚拟机栈
2. JVM垃圾回收算法,垃圾回收器,G1,CMS回收过程,虚拟机怎么保证分配内存时的线程安全
- 标记清除
- 标记整理
- 标记复制
3. JVM类加载
类加载是指把.class 文件加载到jvm虚拟机的过程,主要包括以下几个步骤
-
加载 Loading 根据类的全限定名从磁盘或者网络上加载二进制流(十六进制编码)
此处主要是使用Java的ClassLoader 即类加载器进行加载,常用的类加载器分为以下几个部分
- BootStrap ClassLoader 即根加载器,主要加载rt.jar的类
- Extention ClassLoader 即扩展类加载器, 主要加载.ext下的jar
- Application ClassLoader 即应用类加载器,加载当前classpath下的类
- Custom ClassLoader 即自定义类加载器
-
链接 Linking
- 验证 Verification 验证类文件的格式,比如开头是否是cafebabe等 包括有对应的词法语法解析器
- 准备 Preparing 给类的静态变量初始化空间并赋值初始值
- 解析 Resovling 把一些符号引用转化为内存中的直接引用
-
初始化 Initialization
给类的静态变量赋值
MethodNotFoundException、ClassNotFoundException、ClassDefNotFoundException分别发生在哪个步骤?
4. 垃圾收集器
-
Serial 新生代 使用标记复制 单线程
-
Serial Old 老年代 使用标记整理 单线程
-
ParNew 新生代 使用标记复制,基于Serial 多线程收集
-
Parallel Scavenge 新生代 使用标记复制,更关注吞吐量
-
Parallel Old 老年代 标记整理,关注吞吐量
-
CMS收集器 老年代 使用标记清楚算法 关注停顿时间,整个过程stw 两次
-
先初始标记 stw (每一步具体做了什么???)
-
然后并发标记
-
重新标记 stw
-
并发清除
并发:用户线程和垃圾回收线程可以并行执行 成为并发
-
-
G1 并发收集器 1.9默认 可以设置具体的停顿时间,会更改jvm的内存区域,划分成大小相等的独立区域
相比cms 是在cms 并发清楚的时候这一步进行筛选回收,主要是因为用户设置了停顿时间,所以只能选择性的回收。
- 堆内存的存活率超过了50%
- 对象的分配和晋升速度变化大
- 垃圾回收时间长
5. JVM调优(你是怎么去做jvm调优的)
-
GC收集器:停顿时间和吞吐量
- 停顿时间: 垃圾回收所使用的的时间
- CMS G1 停顿时间较小 适用于web应用 并发类的收集器
- 吞吐量: 吞吐量 = 运行用户代码的时间/(运行用户代码的时间+垃圾回收时间)
- Parallel Scavenge Parallel Old 并行类的收集器
- 停顿时间: 垃圾回收所使用的的时间
-
内存的使用维度
6.如何设置JVM堆的大小
正常来说默认JVM堆的大小=老年代的大小+新生代的大小,默认比例为2:1, 老年代的大小可以设置成老年代FULL GC后存活对象总大小的3到4倍,元数据区域的大小可以设置为老年代存活对象总大小的1.2倍到1.5倍左右,可以通过JVM启动参数 加入GC日志来观察每次FULL GC后的对象总大小,或者通过JMAP -dump命令下载内存快照强制触发full gc 并通过快照分析。
7. 如果jsp的CPU占用过高如何去分析?
8. Jvm内存溢出怎么分析?
9. Happens Before
- Volatile 规则
- a happens before b , b happens before c 则 a happens before c
- 单线程的程序顺序规则
- 线程的start规则,线程start前面的程序一定对线程内部是可见的
- 线程的join规则,
- 锁规则,synchronize规则
10. 对象在堆中的组成结构
以上是关于JVM常见问题的主要内容,如果未能解决你的问题,请参考以下文章