阿里架构师力推 jvm 架构解析文档,把 JVM 调优实战讲的明明白白
一、JVM 内存区域划分
程序计数器(线程私有)
程序计数器(Program Counter Register),也有称作为 PC 寄存器。保存的是程序当
前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当 CPU 需要执
行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得
到的地址获取到指令,在得到指令之后,程序计数器便自动加 1 或者根据转移指针得到下
一条指令的地址,如此循环,直至执行完所有的指令。也就是说是用来指示执行哪条指令的。
由于在 JVM 中,多线程是通过线程轮流切换来获得 CPU 执行时间的,因此,在任一
具体时刻,一个 CPU 的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都
在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数
器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这么说,程序
计数器是每个线程所私有的。
在 JVM 规范中规定,如果线程执行的是非 native 方法,则程序计数器中保存的是当前
需要执行的指令的地址;如果线程执行的是 native 方法,则程序计数器中的值是 undefined。
由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对
于程序计数器是不会发生内存溢出现象(OutOfMemory)的。
本地方法栈(线程私有)
堆
方法区
直接内存
2.JVM 执行子系统
Class 类文件结构
字节码指令
类加载机制
类加载器
Tomcat 类加载机制
方法调用详解
3.垃圾回收器和内存分配策略
Java 中是值传递还是引用传递?
引用类型
基本垃圾回收算法
分代处理垃圾
JAVA 中垃圾回收 GC 的类型
编写高效优雅 Java 程序
面向对象
方法
1 可变参数要谨慎使用
可变参数是允许传 0 个参数的
如果是参数个数在 1~多个之间的时候,要做单独的业务控制。
看代码
2 返回零长度的数组或集合,不要返回 null
方法的结果返回 null,会导致调用方的要单独处理为 null 的情况。返回零长度,调用方可以
统一处理,如使用 foreach 即可。
JDK 中也为我们提供了 Collections.EMPTY_LIST 这样的零长度集合
3 优先使用标准的异常
要尽量追求代码的重用,同时减少类加载的数目,提高类装载的性能。
常用的异常:
IlegalAraumentException -- 调用者传递的参数不合适
lllegalStateException – 接收的对象状态不对,
NullPoint
UnsupportedOperationException –不支持的操作
通用程序设计
1 用枚举代替 int 常量
声明的一个枚举本质就是一个类,每个具体的枚举值就是这个枚举类的实例。
枚举更多作用,看代码。
2 将局部变量的作用域最小化
1. 在第一次使用的地方进行声明
2. 局部变量都是要自行初始化,初始化条件不满足,就不要声明
最小化的好处,减小局部变量表的大小,提示性能;同时避免局部变量过早声明导致不正确
的使用。
3 精确计算,避免使用 float 和 double
可以使用 int 或者 long 以及 BigDecimal
4 当心字符串连接的性能
参考代码 com.xiangxue.ch04.StringUnion15.Test。
在存在大量字符串拼接或者大型字符串拼接的时候,尽量使用 StringBuilder 和 StringBuffer
性能优化
常用的性能评价/测试指标
常用的性能优化手段
应用服务性能优化
异步
集群
应用相关
总结:
jvm 与性能优化知识点整理,文中给大家展示了一部分,大家有需要整个 pdf 文件的可以添加小助理 wx:bjmsb0606006 即可获取免费下载方式!
评论