深入理解JVM阅读笔记

2019-08-09  本文已影响0人  pepsi1000

1. JVM运行时数据区

除了方法区和堆属于线程共享,其它属于线程私有。

1.1. 程序计数器

Java文件经过javac编译成字节码文件后,通过字节码解释器执行字节码指令时,存在线程上下文切换。程序计数器用于记录字节指令的行号,这样线程上下文切换之后,字节码解释器才会记得上一个线程执行到哪个位置。

1.2. 虚拟机栈

1.3. 本地方法栈

非Java方法

举例:CAS是一条CPU原子指令,类似数据库乐观锁的作用,JUC。

1.4. 方法区

存储类信息,常量(常量池,hashSet实现不允许重复),静态变量等。

存在OM

1.5. 堆

1)负责数组和实例对象创建和存储(分配内存)。

2)存在OM

3)堆结构:

4)-Xmx -Xms

5)HotSpot 使用永久代实现方法区,目的是想让GC管理这块内存。

6)即便JVM提供自动分配和释放内存,程序依然存在内存泄漏内存溢出的问题。

2. 对象创建流程

2.1. 检查

2.2. 加载

2.3. 分配内存

2.4. 初始化

2.5. 执行<init>

3. Java对象内存布局

3.1. 对象头

3.2. 实例数据

3.3. 对齐填充

4. 如何访问对象

4.1. 直接指针访问

4.2. 对象句柄访问

5. GC回收如何对象?

  1. 配置虚拟机启动参数。配置参数之后,程序运行期间,若发生GC,就会打印GC日志详情。
vm options: -verbose:gc -XX+PrintGcDetails
  1. 在程序中通过调用静态方法,触发GC
System.gc();

5.1. 引用计数法

5.2. 可达性分析法

6. 垃圾回收算法

6.1. 标记清除算法

6.2. 复制算法

6.3. 标记-整理算法

6.4. 分代收集算法

7. 垃圾回收器

7.1. Serial

7.2. ParNew

7.3. Parallel Scavenge

7.4. Serial old

7.5. Parallel old

7.6. CMS

7.7. G1

上一篇 下一篇

猜你喜欢

热点阅读