基础知识
JVM两大功能
- 软件层面,将.java文件转译成.class文件(字节码文件),让后在机器上运行
- 内存管理
程序计数器
指向当前线程横在执行的字节码指令地址(行号)
虚拟机栈
存储当前线程运行方法时所需要的数据,指令,返回地址
本地方法栈
native方法,机器底层的方法,结构和虚拟机栈类似
方法区
存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据存放在永久代
堆内存
存放对象
方法区和堆内存的结构图
什么对象会被GC回收
- 数据共享逻辑图,每条数据内都有一个程序计数器,虚拟机栈,本地方法栈,也就是说每个线程的数据都是独享的,线程安全的
- Eden区内存不足时,触发MinerGc(young GC)
- 触发一次youngGC ,from区和to区会发生调换,from区变成to区,检查的顺序依然是先检查from区再去检查to区
- 参数含义
xms: staring(初始堆内存)
xmx:max(最大堆内存)
xmn:new(新生代大小) - 新生代的GC算法为:复制回收算法
- 判断对象需要被回收的算法:引用计数法,可达性分析
- 成为GC Root条件
- 虚拟机栈中本地变量表引用的对象
- 方法区中类静态变量引用对象和常量引用对象
- 本地方法栈中的JNI引用对象
- major GC在永久代发生,速度比miner GC慢10倍
垃圾回收
- 长期存活的对象,判定是否应该进入老年代
- XX:MaxTenurningThreshold=15(默认是15次)
- GC 算法:标记清除算法,复制回收算法(新生代使用),标记整理算法
- 垃圾回收器类型
ParNew:多线程回收,-XX:ParallelGCThreads=5,指定并行线程数;
Paraller Scavenge:在意的是吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间);
- 老年代内存不足时,触发full gc(serial old)