JVM相关

JVM相关
JVM运行时的数据区主要包括:PC程序计数器、本地方法栈、虚拟机栈、方法区、堆
PC:程序计数器,主要用来记录当前线程正在执行的字节码的位置,属于线程私有。
**虚拟机栈:**是描述java执行方法的内存模型,每个方法被执行的时候,都会创建一个栈帧,把栈帧压入栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。栈帧用来存储方法的相关信息,包括局部变量数表、返回值、操作数栈、动态连接等。线程私有
本地方法栈: 和虚拟机栈类似,区别是虚拟机栈为执行 Java 方法服务, 而本地方法栈则为
Native 方法服务。
**方法区:**即我们常说的永久代(Permanent Generation)。用来存储被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。运行时常量池(Runtime Constant Pool)是方法区的一部分:存放编译期生成的各种字面量和符号引用;Class文件中除了存有类的版本、字段、方法、接口等描述信息,还有一项是常量池,存有这个类的 编译期生成的各种字面量和符号引用,这部分内容将在类加载后,存放到方法区的运行时常量池中。
:被线程共享的一块内存区,创建的对象、数组都保存在java堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。java堆从垃圾回收的角度还可以细分新生代(Eden区、From Survivor、To Survivor(8:1:1))和老年代(1:2)
常见的垃圾回收算法:
1、Mark-Sweep(标记-清除算法):
分为两个阶段,标记阶段和清除阶段,标记阶段任务时标记出所有需要回收的对象,清除阶段就是清除被标记队形的空间。实现简单,容易产生内存碎片。
JVM相关
2、Cpoying(复制清除算法)
将内存划分为两个大小相等的区域,每次使用其中的一块,当进行垃圾回收的时候,把其中存活对象全部复制到另外一块,然后把已使用的内存空间一次性清空掉。不容易出现内存碎片,但是可能内存空间少,当存活对象多的时候,效率低下。
JVM相关
3、Mark-Compact(标记-整理算法)
先标记存活的对象,然后把存活对象向一边移动,然后清理掉端边界以外的内存。不易产生内存碎片,内存利用率高,存活对象多并且分散的时候,移动次数多,效率低下。
JVM相关
4、分代回收法
因为新生代每次垃圾回收都要回收大部分对象,所以新生代采用Copying算法。新生代里面分成一份较大的Eden空间和两份较小的Survivor空间。每次只使用Eden和其中一块Survivor空间,然后垃圾回收的时候,把存活对象放到未使用的Survivor(划分出from、to)空间中,清空Eden和刚才使用过的Survivor空间。
由于老年代每次只回收少量的对象,因此采用mark-compact算法。
在堆区外有一个永久代。对永久代的回收主要是无效的类和常量

相关面试题参考:https://blog.****.net/qq_41701956/article/details/100074023