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

posted @ 2022-01-10 12:41  黑白灰java  阅读(60)  评论(0)    收藏  举报