JVM内存结构和垃圾回收
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/