JVM内存结构和垃圾回收

2022-02-11 浏览次数:678

1.1 程序计数器是一小块的内存空间,可以看做当**程所执行的字节码的行号指示器。1.2 字节码解释器通过改变计数器的值来选择下一个字节码指令。该计数器需要完成分支、循环、跳转、异常处理和线程恢复。

1.当3 执行方法时,该计数器记录虚拟机字节码指令的地址。

2.1 线程私有,虚拟机栈描述的是Java该方法执行的内存模型。每种方法都创建了存储局部变量表、操作堆栈、动态链接、方法出口等信息的堆栈帧。.2 如果线程要求的栈深度大于虚拟机 允许的深度,则抛出StackOverflowError; 虚拟机栈可以动态扩展。如果在扩展过程中不能申请足够的内存,则可以OutOfMemoryError异常。

虚拟机栈执行java方法,本方法栈实施Native服务

主要存储对象的实例可以通过线程共享的较大区域-Xmx和-Xms进行设置

存储虚拟机类信息(元数据)、常量、静态变量、及时编译代码、常量池JDK1.8中取消了方法区,现在将元数据放入本地内存,常量池和静态方法放入堆中。

2.1.首先,检查该指令的参数是否可以定位在常量池中,并检查该类是否加载、分析和初始化。.2.将内存分配给新对象。如果内存正常使用指针碰撞进行分配,则空闲指针向后移动;否则,使用空闲列表进行分配,记录空闲和使用的内存,并从空闲中选择足够大的空间进行分配。堆决定是否规则2.3.必要设置虚拟机对象

缺点:如有循环依赖,则无法回收

GCRoots对象有:1。栈中引用的对象2。方法区静态对象,常量引用对象3。本地方法栈中JNI引用对象

只有强引用还存在,垃圾回收器永远不会回收

有用但并非必需,发送内存溢出之前,将对象列进回收范围中进行*二次回收,如果回收还是没有足够的内存,才会抛出内存溢出

不必要的对象只能活到下一次垃圾收集发生前。当垃圾回收时,内存是否足够将被回收

垃圾回收系统通知

清除前先标记,缺点:效率低,产生大量空间碎片

首先,将生存对象移动到一端,去除另一端效率低,适合老年人

效率高,内存利用率降低。年轻一代使用,因为当垃圾回收时,大量的年轻一代对象死亡,少量的生存,少量的对象 ** 成本

新生代: ** 算法,老年:标记整理/标记清除

为保证分析结果的准确性,GC一切必须在停顿时停顿Java线程,即stop the world。程序不能在任何地方停止GC,只有达到安全点才能暂停,安全点的选择条件-是否具有长期执行程序的特点,如方法调用、循环跳转、异常跳转


zhang198.cn.b2b168.com/m/
联系我们

在线客服: 1537266597

联系人:刘小姐

联系电话: 13528891007