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

相关推荐
小张小张爱学习15 小时前
JVM高频面试题
java·jvm
Rick199315 小时前
jstack和jstat有什么区别?
jvm·cpu飙高
橙淮1 天前
并发编程(六)
java·jvm
EntyIU1 天前
JVM内存与GC笔记
java·jvm·笔记
雪宫街道1 天前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
小江的记录本1 天前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小江的记录本1 天前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
jameslogo2 天前
类加载机制
jvm
雪度娃娃2 天前
转向现代C++——优先选用删除函数而非private未定义函数
java·jvm·c++
努力发光的程序员2 天前
面试官与程序员谢飞机的3轮Java大厂面试问答实录:涵盖Spring Boot、微服务与数据库技术
java·jvm·spring boot·redis·面试·hibernate·microservices