Java虚拟机
Java编译器的输出是字节码(byteCode).字节码是一套设计用来在java运行时系统下执行的高度优化的指令集,该Java运行时系统称为Java虚拟机(Java Virtual Machine, JVM). 在其标准形式下,JVM就是一个字节码解释器.
运行时数据区
1 程序计数器
可以看做是线程执行的字节码行号指示器
2 Java虚拟机栈
虚拟机描述的是Java方法执行的内存模型, 每个方法在执行的同时都会创建一个栈针(Stack frame) 用于存储局部变量表,操作数栈,动态链接,方法出口信息
3 本地方法栈
服务于本地方法
4 java堆
JVM管理内存中最大的一块,因为GC一般发生在堆上, 所以也叫GC堆, 对象分配的空间, 细分又会分为 年轻代(Eden, From, To), 老年代
5 方法区
存储类加载的信息, 常量, 静态变量
6 运行时常量池
属于方法区, 存储字面常量, 符号引用
1~3 线程私有的空间 4~6 公共空间
垃圾收集器与内存分配策略
- 引用计数法 很难解决循环引用
- 可达性分析算法
GCRoots的对象有下面几种
- 虚拟机栈中的引用的对象
- 方法区中的静态, 常量引用的对象
- 本地方法栈中引用的对象
强软弱虚引用
强 只要引用存在,就不会回收
软 有用但非必须 将要发生内存溢出的时候,就会被回收
弱 非必须 下次GC前存活
虚 为了标记对象在被回收是发送一个系统通知
对象GC发生的时
判断当前对象是否有必要执行finalize()方法
不必要 1 虚拟机已经执行过一次 2, 没有覆盖finalize()方法
有必要 执行此方法, 如果在执行完此方法后,此对象又与GCRoots建立起关系,那么存活
垃圾回收算法
1 标记-清除 算法
2 复制算法 新生代算法 原因: 新生代98%对象都"朝生夕死", 又分为三块区域 Eden : From : To ==== 8 : 1 :1 , 空间利用率是90%, 进入老年代是15次
3 标记-整理算法 老年代算法 原因: 此区域对象存活率高, 不能采用复制算法
4 分代回收算法 就是划分出老年代并且用什么算法, 新生代用什么算法
安全点 SafePoint 才能GC 因为此时才会有OopMap 信息 也就是需要GC的对象信息
垃圾回收器
是对垃圾回收算法的实现 ,有七个
Searial
ParNew 新生代
Paraller Scavenge 新
Searial Old 老
Parallel Old 老
CMS 最低停顿的收集器
G1 收集器
性能监控
jps 打印当前的所有JVM线程
jinfo 虚拟机配置信息
jstat 虚拟机快照
jstact 各方面运行的数据
一些可视化工具 jconsole
虚拟机类加载机制
把Class文件加载到内存中经过的检验,解析,和初始化过程
类加载器
确定一个类的唯一性, Class文件,JVM相同 但只要类加载机制不一样, 类就不一样
双亲委派模型
保证Java程序的稳定运行
启动类加载器 BoorStrap ClassLoader lib目录下
Extension lib\ext
Applicatiion 一般应用程序由次加载 CLASSPATH下
自定义
从下往上,在往下, 父类能加载,父类加载, 不能才是子类加载