第一:内存结构
线程私有区域
虚拟机栈
栈帧
动态链接
操作数栈
局部变量表
方法返回地址
异常
本地方法栈
程序计数器
线程共享区域
堆
新生代
Eden区
Survivor(from)区
Survivor(to)区
老年代
方法区
运行时常量池
静态变量
final类型常量
类信息
直接内存
第二:JVM中的对象
对象的分配
对象的内存布局
对象头
对象的实例数据
对齐填充
对象的访问方式
指针
句柄
两种方式的比较
内存分配
对象优先在Eden区分配
大对象直接进入老年代
长期存活对象进入老年区
对象年龄动态判定
空间分配担保
JVM如何实现泛型
第三:垃圾回收算法与垃圾回收器
对象是否存活
引用计数法
可达性分析算法
GC Roots
请忘记“finalize”
内存回收
Minor GC
Full GC
回收对象引用类型
强引用
软引用
弱引用
虚引用
垃圾收集算法
标记-清除
复制算法
标记-整理
分代回收算法
垃圾收集器
Serial收集器
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
ParNew Old收集器
CMS收集器
G1收集器
第四:JVM执行子程序
class文件结构
魔数
版本号
常量池
字面量
符号引用
访问标志
类索引,父类索引,接口索引集合
字段表集合
方法表集合
访问标志
名称索引
描述符索引
属性表集合
属性表集合
方法调用
动态绑定
参数传递
分派
静态分派
动态分派
单分派
多分派
类生命周期
加载
验证
准备
解析
初始化
使用
卸载
类加载过程
加载
验证
准备
解析
初始化
类加载器
启动类加载器
其他加载器
双亲委派模型
Tomcat类加载机器
第五:JVM性能优化
内存溢出
程序在申请内存时,没有足够的内存空间
内存溢出的构造方式
堆溢出
栈溢出
方法区和运行时常量池溢出
本机内存直接溢出
内存泄漏
程序在申请内存后,无法释放已申请的内存空间
原因
长生命周期的对象持有短生命周期对象的引用
连接未关闭
变量作用域不合理
内部类持有外部类
Hash值改变
分析工具MAT
JDK工具
jps
jstat
jinfo
jmap
jhat
jstack
jsconsole
visualvm
JVM编译期优化
语义分析与字节码生成
逃逸分析
调优案例与实战
GC调优
调优实战
第六:编写高效优雅的JAVA程序
Java语法糖
泛型与类型的擦除
面向对象
构造器参数太多怎么办?
不需要实例化的类应该构造器私有
不要创建不必要的对象
避免使用终结方法
使类和成员的可访问性最小化
使可变性最小化
优先使用复合胜过继承
接口优于抽象类
方法
可变参数要谨慎使用
返回零长度的数组或集合,不要返回null
优先使用标准的异常
通用程序设计
用枚举代替int常量
将局部变量的作用域最小化
精确计算,避免使用float和double
当心字符串连接的性能
控制方法的大小
第七:深入了解性能优化
常用性能评价/测试指标
响应时间
并发数
吞吐量
相互之间的关系
常用的性能优化手段
总原则
前端优化手段
应用服务器性能优化
存储性能优化
应用服务器性能优化
缓存
集群
异步
应用相关
代码级
并发编程
资源复用
JVM
存储性能优化
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧