PS:下面的内容是来自“深入JVM内核—原理、诊断与优化”视频教程,只是简单整理,详细内容可以看回视频和PPT
1. JVM运行机制
1 JVM启动流程
2 JVM基本结构
3 内存模型
4 编译和解释运行的概念
解释运行
a) 解释执行以解释方式运行字节码
b) 解释执行的意思是:读一句执行一句
编译运行(JIT)
c) 将字节码编译成机器码
d) 直接执行机器码
e) 运行时编译
f) 编译后性能有数量级的提升
2. 常用JVM配置参数
1 Trace跟踪参数
2 堆的分配参数
3 栈的分配参数
-Xss
1 通常只有几百K
2 决定了函数调用的深度
3 每个线程都有独立的栈空间
4 局部变量、参数 分配在栈上
3. GC 算法与种类
1 GC的概念
GarbageCollection 垃圾收集
1960年 List 使用了GC
Java中,GC的对象是堆空间和永久区
2 GC算法
引用计数法(没有被Java采用)
老牌垃圾回收算法
通过引用计算来回收垃圾
使用者
COM
ActionScript3
Python
标记清除
标记-清除算法是现代垃圾回收算法的思想基础。
标记压缩
标记-压缩算法适合用于存活对象较多的场合,如老年代。
复制算法
与标记-清除算法相比,复制算法是一种相对高效的回收方法
3 可触及性
4 Stop-The-World
Java中一种全局暂停的现象
全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
多半由于GC引起
Dump线程
死锁检查
堆Dump
4. GC参数
1 堆的回顾
2 串行收集器
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代复制算法
老年代标记-压缩
3 并行收集器
1)ParNew
-XX:+UseParNewGC
新生代并行
老年代串行
Serial收集器新生代的并行版本
复制算法
多线程,需要多核支持
-XX:ParallelGCThreads限制线程数量
2)Parallel收集器
类似ParNew
新生代复制算法
老年代 标记-压缩
更加关注吞吐量
-XX:+UseParallelGC
使用Parallel收集器+ 老年代串行
-XX:+UseParallelOldGC
使用Parallel收集器+ 并行老年代
-XX:MaxGCPauseMills
最大停顿时间,单位毫秒
GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio
0-100的取值范围
垃圾收集时间占总时间的比
默认99,即最大允许1%时间做GC
这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优
4 CMS收集器
ConcurrentMark Sweep 并发标记清除
标记-清除算法
与标记-压缩相比
并发阶段会降低吞吐量
老年代收集器(新生代使用ParNew)
-XX:+UseConcMarkSweepGC
5 Tomcat实例演示
5. 类装载器
1 class装载验证流程
1)加载
2)链接
1.验证
2.准备(例如:分配内存)
3.解析(例如:符号引用替换为直接引用)
3)初始化
2 什么是类装载器ClassLoader
ClassLoader是一个抽象类
ClassLoader的实例将读入Java字节码将类装载到JVM中
ClassLoader可以定制,满足不同的字节码流获取方式
ClassLoader负责类装载过程中的加载阶段
3 JDK中ClassLoader默认设计模式
BootStrapClassLoader (启动ClassLoader)
ExtensionClassLoader (扩展ClassLoader)
AppClassLoader (应用ClassLoader/系统ClassLoader)
CustomClassLoader(自定义ClassLoader)
每个ClassLoader都有一个Parent作为父亲
4 打破常规模式
5 热替换
当一个class被替换后,系统无需重启,替换的类立即生效
6. 1)系统性能监控
1 linux性能监控工具:
1. sysstat(需要安装yum installsysstat)
2 windwos性能监控工具:
1. 任务管理(windwos自带)
2. perfmon(windwos自带)
3. process explorer(需要安装)
4. pslist 命令行工具(需要安装)
6. 2)Java自带的工具
1.jps 列出java进程,类似于ps命令
2.jinfo 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数
3.jmap 生成java应用程序的堆快照和对象的统计信息
4.dump 把堆信息导出到文件,命令:jmap -dump:format=b,file=c:\heap.hprof 2972
5.jstack 打印线程dump,jstack 120 >>C:\a.txt
6.jconsole 图形化监控工具
7.visual vm
7. Java堆分析
1 堆、永久区、线程栈、直接内存都会引起内存溢出(OOM)
2 使用MAT和Visual VM工具分析内存溢出(OOM)的原因
8. 锁
1)线程安全
2)对象头Mark
1)偏向锁
2)轻量级锁
3)自旋锁
1)减少锁持有时间
2)减小锁粒度
3)锁分离
4)锁粗化
5)锁消除
6)无锁
不是Java语言层面的锁优化方法
内置于JVM中的获取锁的优化方法和获取锁的步骤:
1)偏向锁可用会先尝试偏向锁
2)轻量级锁可用会先尝试轻量级锁
3)以上都失败,尝试自旋锁
4)再失败,尝试普通锁,使用OS互斥量在操作系统层挂起
9. Class文件结构
1 语言无关性
2 文件结构
1)魔数
2)版本
3)常量池
4)访问符
5)类、超类、接口
6)字段
7)方法
8)属性
10. JVM字节码执行
1 javap
2 简单的字节码执行过程
3 常用的字节码
4 使用ASM生成Java字节码
5 JIT及其相关参数
以下是我精心整理的文章: