JVM
2018-11-06 本文已影响0人
剑书藏于西
jvm学习分为四部分
- 运行时数据区
- 类加载器
- 类加载过程
- 垃圾回收
- 本地接口
运行时数据区
image.png(1)线程私有区:
- 程序计数器:记录正在执行的虚拟机字节码的地址;
-
虚拟机栈:每个方法执行时都会创建一个帧栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息(局部变量表存放了编译期可知的各种基本数据类型,对象引用和returnAddress
) -
本地方法栈:虚拟机的Native方法执行的内存区;
(2)线程共享区: - Java堆:分为新生代(Eden区和两个survivor区)和老年代
-
方法区(永久代):存放类信息、常量、静态变量、编译器编译后的代码等数据;
○ 常量池:存放编译器生成的各种字面量和符号引用,是方法区的一部分。
类加载器
类加载器.png- Bootstarp ClassLoader(启动类加载器):加载<java_home>/lib下的类库
- ExtClassLoader(扩展类加载器):加载<java_home>/lib/ext目录下的类库
- AppClassLoader(应用程序类加载器):加载classpath所指定的位置下的类(程序员自己写的类位于此目录下)
双亲委派模型
每个要加载的class都先要委托自己的父类加载器加载,当父类加载器无法加载时,再自己加载。
类加载过程
类加载过程.png-
装载(类加载器进行装载)
- 通过一个类的全限定名来获取其定义的二进制字节流。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
- 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。
-
连接
- 验证(1.文件格式的验证。2. 元数据验证。3. 字节码验证。4. 符号引用验证)
- 准备(为static变量赋默认值[非实际值])
- 解析(虚拟机将常量池中的符号引用转化为直接引用的过程。)
-
初始化
执行类构造器<clinit>(),为static变量赋实际值
垃圾回收
垃圾回收.png- 标记垃圾的算法
- 引用计数器法
- 根搜索算法(可达性分析算法)
- 垃圾回收算法
- 复制算法(新生代)
- 标记清除算法(老年代)
- 标记整理算法(老年代)
- 垃圾回收器
- Serial收集器:client模式,单线程,复制算法,简单高效,对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
- ParNew收集器:server模式,复制算法,Serial收集器的多线程版本。
- Parallel Scavenge收集器:复制算法,自适应调节策略, -XX:+UseAdaptiveSizePolicy。当这个参数打开之后,就不需要手工指定新生代的大小、Eden与Survivor区的比例、晋升老年代对象年龄等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量
- Serial Old收集器:单线程,标记整理算法
- Parallel Old收集器:标记整理算法,注重吞吐量以及CPU资源敏感的场合
- CMS收集器:标记清除算法,重视响应速度,希望系统停顿时间最短,以给用户带来较好的体验。
- G1收集器:复制算法和标记整理算法