JVM八股

JVM八股

JVM运行时区域

线程私有

  • 程序计数器
    • 唯一一个没有规定任何OOM的内存区域
    • 作用: 字节码行号指示器,跳转、循环、线程上下文切换都依赖它来完成
  • 虚拟机栈
    • jvm运行java方法的内存模型,栈内存储栈帧,栈帧内有操作数栈、方法返回地址、变量表。方法从被调用到执行完毕的过程就是栈帧从入栈到出栈的过程
    • 当栈的深度过程会爆出StackOverFlowError,当栈动态拓展失败,会报出OOM。
  • 本地方法栈
  • 和虚拟机栈差不多,它服务的是本地方法。

线程共享

  • Java堆
    • 用于存放对象实例和数组,垃圾回收器进行回收的主要区域。
    • 当没有足够的内存为新对象分配时,会报出OOM。
  • 方法区
    • 存放JVM加载的类信息、静态变量、常量、JIT编译的热点代码等。
    • jdk1.8之前采用永久代的方式来实现,之后采用原空间来实现。
    • 使用原空间使用的时直接内存,不在受JVM内存大小的限制
  • 运行时常量池
    • 方法区的一部分

类加载机制

类加载过程

  1. 加载:通过全限定名获取字节码文件的二进制流,加载到内存当中,并生成Class对象。
  2. 验证:验证字节码文件格式是否正确,防止对JVM造成损坏。
  3. 准备: 把类变量置0值。
  4. 解析:将符号引用转换成直接引用
  5. 初始化:为变量初始化值,执行init()方法。

双亲加载机制

类加载类别

启动类加载器、拓展类加载器、应用类加载器、自定义加载器

内容

除了启动类加载器,其他加载器都要有自己的父类加载器。当类加载器收到一个加载任务时,会先把这个人物委派给父加载器, 父加载器在尝试加载这个类,如果不能,自己才会去尝试加载这个类。

作用

保证一个类是在JVM中是唯一的,不会被重复加载。

保护核心类库。

如何打破类加载机制

继承ClassLoad类,重写loadClass()方法

垃圾回收

如何判断一个对象已经死亡

引用计数法

对象中放置一个引用计数器,当一个地方引用到它,引用计数器值+1,当这个引用失效,引用计数器-1,当值为0,就认为这个对象已经死亡。

弊端: 当存在互相引用时,无法进行有效回收

可达性分析法

JVM内部设定了一系列的GC root对象,通过判断对象这些GC root对象之间是否存在引用链关系来判断对象是否存活。

垃圾回收算法

  1. 标记清除算法

    根据可达性分析法,标记存活的对象,然后清理未被标记的对象。

    弊端 : 造成内存碎片化问题。当对象过多时,标记时间会变长。

  2. 标记复制算法

    把内存分为两部分,当一部分使用完时,触发GC,使用可达性分析法标记存活对象,将存活对象移动到另一部分内存,然后直接清理先前的那一部分。

    弊端: 存在移动对象的行为,当需要移动的对象很多时,耗时会增加。

    可供直接使用的内存区域变少了。

  3. 标记整理算法

    使用可达性分析算法标记存活对象,让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内 存。

  4. 分代垃圾回收算法

    • 把Java堆分为新生代和永久代。

      新生代分为两个survivor区和一个eden区。内存比例一般为1:8;

      新创建的对象一般是在eden区分配内存,eden区满了,会触发一次minor GC。存活的对象会进入survivor(from)区。当eden和survivor(from)区满了,再次触发minor GC,存户的对象会从eden区和from进入另一块survivor(to)区,此时这一块to区就变成了from区。

    • 在survivor区的对象会有一个年龄属性,初始值为1,没熬过一个GC,年龄会加1,达到阈值(16),就会进入永久代。

    • 当永久代中空间不存,无法放入新对象,先尝试minorGC,还是不足,会进行full GC

相关推荐
AI浩2 小时前
第 10 章:模型上下文协议 (MCP) 实战 —— 打造专属工具,连接无限世界
jvm
菜鸟小九3 小时前
JVM垃圾回收
java·jvm·算法
爱丽_3 小时前
SQL 事务主线:ACID、隔离级别、MVCC 与一致性读
jvm·矩阵
敖正炀4 小时前
Java 线程状态变化与ObjectMonitor之间的关系
jvm·后端
江不清丶4 小时前
垃圾收集算法深度解析:从标记-清除到分代收集的演进之路
java·jvm·算法
庞轩px4 小时前
【无标题】
java·开发语言·jvm
小鱼不会骑车5 小时前
JVM 内存管理与垃圾回收(GC)深度解析
jvm
敖正炀5 小时前
重量级锁ObjectMonitor 详解
jvm
gelald5 小时前
JVM - 类加载机制
java·jvm·后端