杭州做网站费用做网站赚钱但又不想开公司
2026/1/19 10:55:42 网站建设 项目流程
杭州做网站费用,做网站赚钱但又不想开公司,福州营销型网站建设价格,专门做各种产品测评的网站Java虚拟机运行数据区域在JDK 8及以上版本中#xff0c;Java虚拟机运行时数据区域主要包括以下部分#xff1a;1#xff09;堆#xff08;Heap#xff09;#xff1a;这是Java虚拟机中最大的内存区域#xff0c;所有线程共享#xff0c;主要用于存放对象实例和数组。这…Java虚拟机运行数据区域在JDK 8及以上版本中Java虚拟机运行时数据区域主要包括以下部分1堆Heap这是Java虚拟机中最大的内存区域所有线程共享主要用于存放对象实例和数组。这也是垃圾回收的主要区域因此也被称作GC堆Garbage Collection Heap。2方法区Method Area在JDK 8之前这被称为永久代PermGen。但从JDK 8开始被替换为元空间Metaspace。主要用于存储已加载的类信息、常量、静态变量、编译后的代码等。3栈Stack每个线程创建时都会有一个对应的Java栈用于存储局部变量、操作数栈、动态链接、方法出口等信息。4程序计数器Program Counter Register这是一块小内存区域作为当前线程执行的字节码的行号指示器。每个线程都有一个独立的程序计数器。5本地方法栈Native Method Stack类似于Java栈用于支持本地方法的执行。6直接内存Direct Memory虽然不是虚拟机运行时数据区的一部分也不是Java虚拟机规范中定义的内存区域但这部分内存被频繁使用主要被NIO用于提高IO效率。imageJava虚拟机的堆划分当前主流的Java虚拟机主要采用分代回收Generational Garbage Collection。分代回收更准确地说它是一种理念。这种理念将系统中的所有对象划分为不同的代Generation并根据对象的生命周期长度将其分类到相应的代中每个代则采用适合其特性的垃圾回收算法。这种理念主要基于两个分代假设。1弱分代假说Weak Generational Hypothesis大部分对象都会在创建后不久就变得不可达。也就是说许多对象的生命周期都很短2强分代假说Strong Generational Hypothesis存活时间较长的对象很可能会引用存活时间较短的对象但反之则不然。也就是说老的对象很少引用新的对象。Java虚拟机将堆划分为新生代Young Generation和老年代Old Generation。其中新生代又被划分为Eden区以及两个大小相同的Survivor区。默认情况下Java虚拟机采取一种动态分配的策略根据生成对象的速率以及Survivor区的使用情况动态调整Eden区和Survivor区的比例。imageTLAB通常调用new指令时会在Eden区中划出一块作为存储对象的内存。由于堆空间是线程共享的在多线程环境下为了避免多个线程同时向堆内存申请空间而产生的竞争Java虚拟机为每个线程分配了一个私有的缓冲区即TLABThread-Local Allocation Buffer。由于TLAB是线程私有的因此在分配对象时不需要进行线程同步大大提高了对象分配的效率。如果TLAB空间不足那么线程可能需要申请新的TLAB。需要注意的是TLAB只适用于小对象的分配。对于大对象通常直接在堆内存中进行分配。imageMinor GC、Minor GC、Full GC当Eden区空间不足时会触发Minor GC对年轻代进行垃圾回收。存活下来对象会被迁移到Survivor区。新生代包含两个Survivor区分别为from和to区其中to区始终保持空闲。Minor GC期间Eden区和from区的存活对象被复制至to区随后交换from和to确保下次Minor GC时to区为空。Java虚拟机会跟踪Survivor区对象的复制次数当达到15次或单个Survivor区占用率超过50%时那么较高复制次数的对象将被晋升Promote至老年代。Minor GC主要采用复制算法Survivor区中的老存活对象晋升至老年代然后将剩余存活对象与Eden区的存活对象复制至另一Survivor区。在理想情况下Eden区的对象大多已死亡因此需要复制的数据量较小因此采用复制算法效率较高。当老年代空间不足时触发Major GC对老年代进行垃圾回收。Major GC通常采用清除或整理算法由于需要扫描整个老年代并可能进行对象移动以整理内存因此会导致较长的停顿时间。当Java堆内存空间不足时触发Full GC对整个堆内存包括新生代和老年代进行垃圾回收。由于需要扫描整个堆内存并可能进行对象移动以整理内存Full GC会导致比Major GC更长的停顿时间。卡表Minor GC期间在标记存活对象的时候可能会碰到跨代引用对象的问题。由于年轻代大都是存活时间较短的对象跨代引用通常是指老年代对象存在对新生代对象的引用。为了保证对年轻代存活对象标记准确性就不得不把老年代也纳入到扫描范围。为了解决跨代引用的问题可以在新生代可以引入记忆集RememberSet。记忆集位于新生代中是一种用于记录从非回收区域指向回收区域的指针集合的抽象数据结构。image记忆集是一种概念在Java虚拟机中记忆集通常通过卡表Card Table实现它也是目前最常用的一种方式。卡表是一个字节数组其中每个元素对应一块特定大小默认512字节的内存区域称为卡页Card Page。当对象的引用发生修改时写屏障会被触发将对应的卡页标记为脏表示该内存区域的对象已被修改。为了降低写屏障的开销并保持其生成指令的简洁性写屏障并不判断更新后的引用是否指向新生代对象而是统一视为可能指向新生代对象的引用。if (CARD_TABLE [this address 9] ! DIRTY)CARD_TABLE [this address 9] DIRTY;在进行Minor GC的时就无需扫描整个老年代而是在卡表中寻找标记为脏卡的区域并将这些脏卡区域的对象加入到Minor GC的GC Roots中。完成所有脏卡的扫描后Java虚拟机会清除所有脏卡的标记。image未完待续很高兴与你相遇如果你喜欢本文内容记得关注哦

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询