pageadmin如何做网站,网页设计论文致谢,网站开发技术主管工作职责,展示型建站模板平台一、JVM内存结构
1、方法区#xff1a;存储编译后的类、常量等#xff08;.class字节码文件#xff09;
2、堆内存#xff1a;存储对象
3、程序计数器#xff1a;存储当前执行的指令地址#xff08;计算机处理器#xff08;CPU#xff09;正在执行的下一条指令在内存…一、JVM内存结构
1、方法区存储编译后的类、常量等.class字节码文件
2、堆内存存储对象
3、程序计数器存储当前执行的指令地址计算机处理器CPU正在执行的下一条指令在内存中的地址
4、虚拟机栈java栈存储局部变量、方法参数、返回值以及异常处理信息
5、本地方法栈存储本地方法的执行状态信息以上是JVM内存结构的主要部分其中除了方法区外其他部分都是java程序员直接操作和调优的重要部分
线程私有程序计数器、虚拟机栈、本地方法栈。
线程共享方法区、堆。 以下是一个更完整的示例代码演示了JVM内存结构的各个部分
public class MemoryStructureExample {// 静态变量存储在方法区private static String staticVar Static Variable;public static void main(String[] args) {// 局部变量存储在虚拟机栈int localVar 10;// 创建一个对象实例存储在堆内存MemoryStructureExample obj new MemoryStructureExample();// 调用方法会在虚拟机栈中创建方法调用的栈帧obj.method();}// 实例方法public void method() {// 方法中的局部变量存储在虚拟机栈String localVar2 Local Variable;// 创建一个对象实例存储在堆内存Object obj new Object();// 调用本地方法本地方法栈存储本地方法的执行状态信息System.out.println(System.currentTimeMillis());}
}
在这个示例中我们展示了JVM内存结构的各个部分的应用
静态变量staticVar存储在方法区main方法中的局部变量localVar存储在虚拟机栈MemoryStructureExample对象实例存储在堆内存method方法中的局部变量localVar2也存储在虚拟机栈方法中创建的Object对象实例也存储在堆内存调用本地方法System.currentTimeMillis()时本地方法栈存储本地方法的执行状态信息。
二、JVM垃圾回收 GC 的目的在于实现堆内存中无用对象内存自动释放减少内存碎片、加快分配速度 。线程私有的不存在垃圾回收线程共享才存在垃圾回收。以下我们围绕如何发现垃圾和如何进行垃圾回收进行详细描述
一如何发现垃圾
1、引用计数算法 引用计数算法核心思想是堆中的对象每被引用一次则计数器加 1每减少一个引用就减 1当对象的引用计数器为 0 时可以被当作垃圾收集。
优点效率高比较快
缺点无法检测出循环引用如两个对象互相引用时他们的引用计数永远不可能为 0
2、可达性分析根搜索算法 根搜索算法是把所有的引用关系看作一张图从一个节点 GC ROOT 开始寻找对应的 引用节点找到这个节点以后继续寻找这个节点的引用节点当所有的引用节点寻找完毕 之后剩余的节点则被认为是没有被引用到的节点即可以当作垃圾。
3、三色标记法黑灰白 三色标记法是用三种颜色记录对象的标记状态。这种算法通过标记对象的颜色来表示它们的状态以确定哪些对象是活动的哪些是垃圾对象。黑色-已标记灰色-标记中白色-未标记。原理是通过将引用链上的对象全部标记最终剩余的不在引用链上的对象全部是白色的未标记的然后对未标记的无用的对象进行回收。这种算法通过标记对象的颜色来表示它们的状态以确定哪些对象是活动的哪些是垃圾对象。
3.1起始的三个对象还未处理完成用灰色表示 3.2该对象的引用已经处理完成用黑色表示黑色引用的对象变为灰色 3.3依次类推 3.4沿着引用链都标记了一遍 3.5最后为标记的白色对象即为垃圾 二如何清除垃圾
1、标记清除算法空间碎片CMS 标记清除算法是通过GC Root引用链往下查找对于引用链上有引用的对象进行标记然后对之外的无用的对象进行清除。缺点是存在内存碎片的问题。 2、标记整理算法性能较差G1 标记整理算法是在标记清除算法上多了一步整理的操作去除了空间碎片的问题。缺点是性能较差 3、标记复制算法占用成倍的空间 3.1将整个内存分成两个大小相等的区域from 和 to其中 to 总是处于空闲from 存储新创建的对象。 3.2标记阶段与前面的算法类似。 3.3在找出存活对象后会将它们从 from 复制到 to 区域复制的过程中自然完成了碎片整理 3.4复制完成后交换 from 和 to 的位置即可。 三、四种引用 总的来说强引用是最常见的引用类型只有在不再被引用时才会被回收软引用在内存不足时会被回收弱引用在下一次垃圾回收时会被回收虚引用在对象被回收时会被放入引用队列中需要手动清除。根据不同的需求和场景可以选择合适的引用类型来管理对象的生命周期。
一强引用 普通变量赋值即为强引用如 A a new A();通过 GC Root 的引用链如果强引用不到该对象该对象才能被回收。 二软引用 例如SoftReference a new SoftReference(new A());如果仅有软引用该对象时首次垃圾回收不会回收该对象如果内存仍不足再次回收时才会释放对象软引用自身需要配合引用队列来释放典型例子是反射数据。
三弱引用 例如WeakReference a new WeakReference(new A());如果仅有弱引用引用该对象时只要发生垃圾回收就会释放该对象弱引用自身需要配合引用队列来释放典型例子是 ThreadLocalMap 中的 Entry 对象。 四虚引用 例如 PhantomReference a new PhantomReference(new A(), referenceQueue); 必须配合引用队列一起使用当虚引用所引用的对象被回收时由 Reference Handler 线程将虚引用对象入队这样就可以知道哪些对象被回收从而对它们关联的资源做进一步处理 典型例子是 Cleaner 释放 DirectByteBuffer 关联的直接内存。