唯一一个不会出现 OutOfMemoryError
的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了
线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡
- 介绍下 Java 内存区域(运行时数据区)
线程私有的:
- 程序计数器
- 虚拟机栈
- 本地方法栈
线程共享的:
- 堆
- 方法区
- 直接内存 (非运行时数据区的一部分)
- Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
类加载检查--分配内存(指针碰撞&空闲列表)--初始化零值--设置对象头--执行init方法
- 对象的访问定位的两种方式(句柄和直接指针两种方式)
- 如何判断对象是否死亡(两种方法)。(引用计数&可达性分析)
- 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
- 如何判断一个常量是废弃常量
- 如何判断一个类是无用的类
- 垃圾收集有哪些算法,各自的特点?
- HotSpot 为什么要分为新生代和老年代?
比如在新生代中,每次收集都会有大量对象死去,所以可以选择”标记-复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集
- 常见的垃圾回收器有哪些?
- 介绍一下 CMS,G1 收集器。
一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征
- Minor Gc 和 Full GC 有什么不同呢?
分配担保机制 把新生代的对象提前转移到老年代中
避免为大对象分配内存时由于分配担保机制带来的复制而降低效率
针对 HotSpot VM 的实现,它里面的 GC 其实准确分类只有两大种:
部分收集 (Partial GC):
- 新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集;
- 老年代收集(Major GC / Old GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代整堆收集;
- 混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。
整堆收集 (Full GC):收集整个 Java 堆和方法区。
著作权归所有 原文链接:https://javaguide.cn/java/jvm/jvm-garbage-collection.html
- 2.1 魔数(Magic Number)
- 2.2 Class 文件版本号(Minor&Major Version)
- 2.3 常量池(Constant Pool)
- 2.4 访问标志(Access Flags)
- 2.5 当前类(This Class)、父类(Super Class)、接口(Interfaces)索引集合
- 2.6 字段表集合(Fields)
- 2.7 方法表集合(Methods)
- 2.8 属性表集合(Attributes)
著作权归所有 原文链接:https://javaguide.cn/java/jvm/class-file-structure.html