深入理解Java虚拟机
2017-10-13 11:11:06 0 举报
AI智能生成
深入理解Java虚拟机
作者其他创作
大纲/内容
Java编译器与代码优化
前端编译器
javac
.java→.class
语法糖
语法的严谨性↑
效率↑
↓出错几率
程序编码风格、效率
JIT编译器(Just In Time)
概述
字节码→机器码
运行期的优化
占用程序的运行时间
性能↓→开发效率↑
分类
Client Compiler(C1)
简单、可靠的优化
关注局部性的优化
Server Compiler(C2)
编译耗时较长的优化
不可靠的激进优化
面向服务器端的应用
热点探测
what
被多次调用的方法
多次执行的循环体
how
采样
计数器
优化技术
公共子表达式消除
数组边界检查消除
方法内联
逃逸分析
分析对象作用域
如果只在本方法访问对象,可优化
高效优化
栈上分配
对象分配在栈上,内存自动销毁
↓GC压力
同步消除
标量替换
动态扩展
运行时加载新类
难以全局优化
编译器无法看见程序全貌
AOT编译器(Ahead Of Time)
直接*.java→机器码
GNU Complier for the Java(GCJ)
高效并发
JMM
内存
主内存
所有变量
工作内存
线程使用的变量
主内存副本拷贝
volatile
保证对所有线程的可见性
运算并非原子操作
禁止指令重排序优化
线程安全
互斥同步
共享数据同一时刻只被一个线程使用
synchronized
monitorenter
monitorexit
问题
线程阻塞、唤醒→性能降低
悲观的并发策略
非阻塞同步
乐观的并发策略
CAS原子操作
锁优化
适应性自旋
锁消除
锁粗化
轻量级锁
偏向锁
深入理解Java虚拟机
走近Java
JDK
Java语言
JRE
Java虚拟机
Java API类库
版本
1.5
语法
自动装箱
泛型
动态注解
枚举
可变长参数
foreach
虚拟机
改进JMM(Java内存模型)
concurrent并发包
1.6
锁与同步
垃圾收集
类加载
1.7
switch中允许字符串
null值自动处理
1.8
函数式接口
Lambda表达式
接口增强
1.9
未出
特性
Java+REPL:命令行jshell
微基准测试
G1垃圾回收器
HTTP2.0
HotSpot VM
热点代码探测
Sun JDK和OpenJDK采用
未来
模块化
项目:Jigsaw
Java1.9
混合语言
多核并行
进一步丰富语法
64位虚拟机
自动内存管理机制
内存区域
运行时数据区
程序计数器
当前线程所执行的字节码的行号指示器
线程私有
Java虚拟机栈
方法的内存模型
1个栈帧↔1个方法
本地方法栈
Native方法
Java堆
内存最大的一块
存放对象实例
GC主要区域
-Xmx:JVM最大可用内存
-Xms:JVM初始化内存大小
方法区
存储已被JVM加载
类信息
常量
静态变量
即时编译后的代码
运行时常量池
直接内存
JDK 1.4引入NIO
New Input/Output
基于通道(Channel)与缓冲区(Buffer)的I/O工作方式
使用Native函数库直接分配堆外内存
避免在Java堆和Native堆中来回复制数据
GC
对象已死?
引用计数法
优点
实现简单
判定效率高
缺点
循环引用
可达性分析算法
GC Roots→引用链
引用
强引用
引用在,不回收
软引用
SoftReference
OOM前,把这些对象回收
如果仍OOM→抛出异常
弱引用
WeakReference
下一次GC则清除
虚引用
PhantomReference
回收时→系统通知
G1收集器(Java9新特性)
应用
面向服务端的GC
特点
并行与并发
充分利用多CPU、多核环境
↓Stop-The-World停顿时间
分代收集
空间整合
不会产生内存空间碎片
分配大对象
不会没有连续内存空间
而提前触发GC
可预测的停顿
内存分配和回收策略
对象优先在Eden分配
大对象直接→老年代
长期存活的对象→老年代
垃圾收集算法
标记-清除
标记所有要回收的对象
统一回收
bad
效率问题
标记和清除的效率都不高
空间问题
大量不连续的内存碎片
复制
内存→1/2
good
运行高效
新生代
1 Eden
2 Survivor
标记-整理
老年代
存活率高
why
不同对象,存活周期不同
选择最适合的算法
大批对象死去、少量存活
对象存活率高
JVM监控工具
JDK命令行
jps
JVM进程查看
jstat
JVM统计信息
jinfo
Java配置信息
jmap
Java内存映像
jhat
JVM堆转存储快照
jstack
Java堆栈跟踪
JDK可视化
JConsole
VisualVM
虚拟机字节码执行引擎
执行引擎
物理机的
直接建立在
处理器
硬件
指令集
操作系统
虚拟机的
自己实现
自行制定指令集
执行引擎的结构
可以执行不被硬件直接支持的指令集
字节码
程序编译→字节码→JVM解析
Java规范
Java语言规范
Java虚拟机规范
平台无关性
Class类文件
魔数-Class文件版本
魔数
0xCAFEBABE
次版本号
主版本号
常量池
访问标志
索引集合
字段表集合
方法表集合
属性表集合
JVM把类数据从Class文件→内存
校验→转换解析→初始化→Java类型
程序运行期
动态加载、动态连接
网络二进制流→程序代码
时机
遇到new等字节码指令
反射调用
初始化类,父类未初始化
JVM启动时的主类
过程
加载
JVM
通过类的全限定名→类的二进制流
静态存储结构→方法区的运行时结构
内存生成对象→该类的数据访问入口
来源
Class文件
javac编译
zip
jar
ear
war
网络
Applet
运行时计算
动态代理
其他文件
JSP
数据库
验证
不危害JVM
数据准确性、安全性
准备
解析
初始化
类加载器
双亲委派模型
启动类加载器
\\lib
扩展类加载器
\\lib\\ext
应用程序类加载器
0 条评论
回复 删除
下一页