JVM入门
内存区域
专属线程的(生命周期与线程的创建周期相同):
PCI:用于依次读取指令,实现代码的流程控制;用于记录当前线程执行的位置,从而实现上下文切换。
虚拟机栈:描述java方法执行的内存模型,每次方法调用的数据都是通过栈传递的。虚拟机栈由栈帧组成,栈帧拥有局部变量表、操作数栈、动态链接、方法出口信息等。局部变量表存放了各种数据类型和对象引用
本地方法栈:为虚拟机使用的native方法服务,存放本地方法的局部变量表等
线程共享的:
堆(栈管运行,堆管存储)
存放对象实例和数组,而且是垃圾收集器管理的主要区域
分为新生代(Eden,from survivor,to survivor 默认配比8:1:1) 老年代
方法区(永久代,非堆),1.8后改为元空间(不在jvm中,使用直接内存)
存储JVM加载的类信息、常量、静态变量等
类加载:字节码加载到jvm的过程,分为类加载,连接(验证,准备,解析),初始化,使用和卸载
类加载器(ClassLoader)双亲委派模型:由顶层到自定义层尝试加载类信息
对象创建过程
重点:类加载检查(双亲委派模型,三种固定的ClassLoader与自定义的类加载器)
内存分配的两种方式:指针碰撞(堆内存规整的情况)、空闲列表
内存分配并发问题(堆内存是共享内存):CAS失败重试、TLAB线程预先分配Eden的内存
垃圾回收机制

进入老年代的两种情况(Full GC):
- MaxTenuringThreshold(年龄限制)
- TargetSurvivoreRation(占比限制)
GC如何确定堆中的对象可以被回收呢?
- 引用计数器(引用失效计时器-1)
- 可达性分析(GC root向下搜索,路径是引用链)
垃圾回收算法
- 标记清除算法
- 标记整理算法
- 标记复制算法
- 分代处理算法
jvm调优
堆地址调整
-Xms 初始堆大小
-Xmx 最大堆大小
-Xxn(新生代大小)
栈地址调整
-Xss

浙公网安备 33010602011771号