当前位置: 首页 > news >正文

零基础做地方门户网站123网页浏览器

零基础做地方门户网站,123网页浏览器,江门天,江苏建工今天开始#xff0c;咱们开始剖析JVM内存划分的原理细节#xff0c;以及我们创建的那些对象在JVM中到底是如何分配#xff0c;如何流动的#xff0c;首先解决第一个问题#xff1a;JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道#xff0c;那就是我… 今天开始咱们开始剖析JVM内存划分的原理细节以及我们创建的那些对象在JVM中到底是如何分配如何流动的首先解决第一个问题JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道那就是我们在代码里创建的对象“都”会进入到Java堆内存。 为什么需要分代 JVM需要分代的主要原因是优化垃圾回收Garbage Collection, GC的效率。以下是分代垃圾回收模型的几个关键优势 对象生命周期的统计特性 大多数对象都是朝生夕死即它们被创建后很快就会变得不再被使用。分代模型利用了这一特性将新创建的对象放在年轻代这样大部分短暂的对象可以快速被回收而不需要频繁地对整个堆进行垃圾回收。 垃圾回收效率 年轻代的垃圾回收Minor GC通常比老年代的垃圾回收Major GC或Full GC要快得多因为年轻代的对象数量多但存活率低。通过在年轻代进行频繁的垃圾回收可以快速清理大量不再使用的对象减少对老年代的影响。 减少Full GC的频率 由于大部分对象在年轻代就会被回收因此进入老年代的对象相对较少这减少了对整个堆进行垃圾回收Full GC的需要Full GC通常成本更高因为它需要扫描整个堆内存。 内存分配的局部性优化 年轻代的内存分配通常具有很好的局部性因为新对象倾向于在相近的内存地址上创建。这有助于现代CPU缓存的利用从而提高内存访问效率。 对象老化的自然过程 对象在年轻代中经过多次GC后如果仍然存活说明它们可能是长时间存活的对象。将这些对象移动到老年代可以减少年轻代中对象的老化检查从而提高GC效率。 不同的垃圾回收算法 年轻代和老年代可以使用不同的垃圾回收算法。例如年轻代通常使用复制算法因为它简单且高效而老年代可能使用标记-清除或标记-清除-整理算法因为老年代的对象存活率更高需要更复杂的算法来处理碎片问题。 内存空间的合理分配 通过分代JVM可以根据对象的生命周期特性合理分配内存空间。年轻代通常分配较小的内存空间因为大多数对象都是短暂存在的而老年代则分配较大的空间用于存放长期存活的对象。 适应不同的应用场景 不同的应用可能有不同的对象生命周期特性。通过分代JVM可以更灵活地适应不同的应用场景通过调整年轻代和老年代的大小以及垃圾回收算法来优化性能。 通过上述分代模型的优势JVM能够更高效地管理内存减少垃圾回收的开销从而提高Java程序的整体性能。 新生代是如何进入老年代的 新生代对象进入老年代的过程通常被称为晋升Promotion。以下是对象从新生代晋升到老年代的几个关键步骤和机制 对象分配 当一个新对象在Java程序中创建时它首先被分配到新生代的Eden区。 Minor GC 新生代会定期进行Minor GC以回收Eden区和Survivor区中不再被引用的对象。存活的对象会被复制到另一个Survivor区S0或S1。 对象年龄 在Minor GC之后存活的对象会有一个年龄计数器每次在Survivor区之间复制时对象的年龄会增加。 年龄阈值 对象的年龄达到一定的阈值默认是15但可以通过-XX:MaxTenuringThreshold参数调整对象就会被认为足够老应该被晋升到老年代。 动态年龄调整 JVM会根据Survivor区的使用情况动态调整对象晋升到老年代的年龄阈值。如果Survivor区空间不足JVM可能会降低年龄阈值使对象更快地晋升到老年代。 空间分配担保 当一个对象在Survivor区存活多次后JVM会检查老年代的可用空间。如果老年代有足够的空间对象会被晋升如果没有JVM会尝试进行一次Full GC来清理老年代的空间然后再尝试晋升对象。 晋升到老年代 一旦对象的年龄达到阈值或者Survivor区空间不足对象就会被复制到老年代。在老年代对象不需要像在新生代那样频繁移动因为老年代的垃圾回收频率较低。 空间分配担保的实现 晋升过程中JVM会使用一种称为空间分配担保Space Accounting Guarantee的策略确保老年代有足够的空间来接收新生代晋升的对象。如果老年代空间不足JVM会尝试压缩老年代或者触发Full GC。 TLABs 为了进一步优化内存分配JVM还使用线程本地分配缓冲区Thread Local Allocation Buffers, TLABs。每个线程有自己的TLAB用于分配对象这样可以减少线程之间的内存分配竞争。 通过这些机制JVM能够根据对象的生命周期特性有效地将对象从新生代晋升到老年代同时保持垃圾回收的效率和性能。 什么时候触发新生代垃圾回收 新生代垃圾回收Minor GC的触发时机如下 内存分配限制当新生代的Eden区内存耗尽无法满足新对象的内存分配请求时将触发Minor GC以释放内存空间。 内存使用监控JVM内部监控新生代内存使用情况当达到预设的内存使用阈值时可能触发Minor GC。 GC算法实现根据JVM所采用的垃圾回收算法实现可能存在特定的条件或时间间隔来触发Minor GC。 显式GC请求尽管System.gc()方法的调用并不保证立即执行GC但它提供了一个显式的GC请求JVM可能会响应此请求并触发Minor GC。 自适应调整JVM可能采用自适应算法根据应用程序的内存分配模式和垃圾回收效率来动态决定Minor GC的触发时机。 内存分配速率如果对象的内存分配速率持续超过GC回收速率JVM可能会触发Minor GC以避免内存溢出。 堆内存压力在堆内存使用接近其最大容量时JVM可能会增加Minor GC的频率以防止内存耗尽。 JVM参数配置特定的JVM启动参数如-XX:UseAdaptiveSizePolicy允许JVM根据当前的内存分配和回收效率自适应地调整新生代的大小和Minor GC的触发策略。 外部系统因素操作系统的内存压力或资源限制也可能间接影响JVM对Minor GC的触发决策。 GC日志和性能监控通过监控GC日志和性能指标JVM可以分析对象生命周期和内存分配模式以优化Minor GC的触发时机。 Minor GC是JVM内存管理的关键机制之一其触发机制的设计旨在平衡内存回收的效率和应用程序的性能需求。 什么情况会进入老年代 在JVM中对象从新生代晋升到老年代的条件主要包括以下几点 年龄阈值对象在Survivor区存活的次数达到JVM设置的年龄阈值-XX:MaxTenuringThreshold参数默认为15该对象将被晋升到老年代。 空间分配担保如果Survivor区的空间不足以容纳经过Minor GC后存活的对象JVM会检查老年代的可用空间。如果老年代有足够的空间这些对象将被直接晋升到老年代。 动态年龄调整JVM可能会根据当前内存分配和回收的统计信息动态调整对象晋升到老年代的年龄阈值。 老年代空间充足即使对象的年龄未达到最大年龄阈值如果老年代有足够的空间JVM也可能将对象提前晋升到老年代。 Full GC后的存活对象在执行Full GC老年代GC后新生代中所有存活的对象可能被直接晋升到老年代以减少跨代引用的问题。 大对象直接分配对于占用大量连续内存的大对象如大型数组JVM可能会直接将其分配到老年代以避免在新生代中分配时产生过多的内存碎片。 长期存活对象某些对象由于其生命周期较长经过多次Minor GC后仍然存活这些对象最终会被晋升到老年代。 JVM参数配置JVM参数如-XX:TargetSurvivorRatio目标Survivor区使用率和-XX:PretenureSizeThreshold直接分配到老年代的对象大小阈值可以影响对象晋升到老年代的行为。 内存分配策略JVM的内存分配策略如TLABThread Local Allocation Buffer的使用也可能影响对象是否直接在老年代分配。 垃圾回收器的选择不同的垃圾回收器可能有不同的晋升策略和内存管理机制。 对象晋升到老年代是一个动态的过程JVM会根据当前的内存使用情况和垃圾回收效率来做出最合适的决策。 分别怎么进行垃圾回收 VM中的垃圾回收Garbage Collection, GC主要针对新生代和老年代采用不同的策略以下是两种区域垃圾回收的基本方法 新生代垃圾回收Minor GC或Young GC 复制算法新生代通常使用复制算法Copying。该算法将Eden区和Survivor区S0中存活的对象复制到另一个Survivor区S1。复制完成后Eden区和S0中的所有对象都会被清理。 对象年龄每次Minor GC后存活的对象年龄会递增。当对象的年龄达到-XX:MaxTenuringThreshold参数设定的阈值时对象会被晋升到老年代。 清理过程Minor GC主要涉及Eden区和Survivor区的清理不涉及老年代。 内存分配新创建的对象首先分配到Eden区或者直接分配到TLAB如果启用。 触发条件当Eden区被填满或者Survivor区无法容纳从Eden区复制过来的存活对象时会触发Minor GC。 老年代垃圾回收Major GC或Full GC 标记-清除算法老年代的垃圾回收通常从标记所有存活的对象开始然后清除未被标记的对象。 标记-清除-整理为了防止内存碎片化清除之后可能会进行一次整理将存活的对象移动到堆的一端以便于连续内存分配。 并发收集老年代的垃圾回收可能采用并发收集算法以减少GC暂停时间。 分代收集老年代的GC可能与新生代的GC同时进行这种GC被称为Full GC。 压缩技术为了减少内存碎片老年代的GC可能采用压缩技术如G1 GC的Region重排。 触发条件老年代GC可能由以下条件触发 老年代空间不足。显式调用System.gc()。达到某些JVM参数设定的内存使用阈值。 内存分配老年代用于存放长期存活的对象以及从新生代晋升上来的对象。 性能影响由于老年代GC涉及整个堆或大部分堆的内存它通常比Minor GC有更长的暂停时间和更大的性能影响。 总结 新生代GCMinor GC通常更频繁使用复制算法回收速度快影响较小。老年代GCMajor GC或Full GC较少见使用标记-清除可能伴随整理算法回收速度慢可能引起较长时间的暂停。 JVM的垃圾回收策略和算法可以根据具体的垃圾回收器和JVM参数进行调整以适应不同的应用场景和性能要求。 什么是永久代? 在JVM中永久代Permanent Generation简称PermGen是方法区的一种实现主要用于存储类信息、常量、静态变量等数据。以下是对您提供内容的扩展和澄清 永久代PermGen的角色 类信息存储永久代存储了类的元数据包括类的字段、方法、构造函数等信息。常量池存储编译期就已经确定的字面量和符号引用。静态变量存储类的静态变量。ClassLoader数据存储类加载器的引用。 方法区垃圾回收的条件 方法区中的类信息并不是一直存在的它们也可以被垃圾回收。以下是类信息可以被回收的条件 实例对象的回收类的所有实例对象已经被垃圾回收即Java堆中不存在该类的任何实例。ClassLoader的回收加载该类的ClassLoader已经被垃圾回收。无引用的Class对象堆中不存在任何对该Class对象的引用。 垃圾回收机制 条件触发只有当上述三个条件同时满足时类信息才会变成垃圾被JVM的垃圾回收机制处理。回收过程JVM在进行垃圾回收时会检查类是否满足回收条件如果满足就会在下一次的Full GC中被清除。 元空间 元空间Metaspace在Java 8中永久代被元空间所取代。元空间使用的是本地内存Native Memory而不是虚拟机内存Heap Memory这样做的好处是可以避免永久代空间不足的问题。 永久代是JVM中用于存储类信息的重要内存区域但它并不是永久存储的。类信息在满足特定条件后可以被垃圾回收这是JVM内存管理的一部分有助于释放不再使用的类信息优化内存使用。随着Java 8的发布元空间取代了永久代提供了更为灵活的类信息存储方式。 今天介绍了很多很多概念相关的知识点让大家有个大概的印象后续会一个一个剖析。 专题汇总 JVM专题一深入分析Java工作机制 JVM专题二Java如何进行编译的 JVM专题三Java代码如何运行 JVM专题四JVM的类加载机制 JVM专题五类加载器与双亲委派机制 JVM专题六JVM的内存模型 JVM专题七JVM垃圾回收机制 JVM专题八JVM如何判断可回收对象 JVM专题九JVM分代知识点梳理 JVM专题十JVM中的垃圾回收机制 JVM专题十一JVM 中的收集器一 JVM专题十二JVM 中的收集器二 JVM专题十三总结与整理面试常用
http://www.zqtcl.cn/news/356527/

相关文章:

  • 可以做行程的网站网站详情怎么做的
  • 网站建设心得8000字营销型网站建设的注意事项
  • 织梦购物网站整站源码哈尔滨网站建设技术托管
  • 做推广的网站微信号企业免费网站制作
  • 做旅游网站的引言上海公司网站建设哪家好
  • 找项目去哪个网站网站建设一条龙全包
  • 网站 数据库 模板网站系统建设合作合同范本
  • 网站空间租赁费用企业网站建设需要多少钱知乎
  • 免费建网站哪个模板多浅谈学校网站建设
  • 精致的个人网站手机网站建设基本流程图
  • 优秀网站网页设计图片主机屋做网站视频
  • 安徽网站建设电话编程一个最简单游戏代码
  • 西宁圆井模板我自己做的网站在线平面设计图
  • 浦口区网站建设技术指导做软件需要网站吗
  • 丹东有做公司网站的吗搜索引擎 wordpress
  • 做网站代理国内课程网站建设现状
  • 中国建设银行手机网站下载从零开始建设企业网站
  • 网站友情链接怎么弄seo平台
  • 建设网站一定要备案吗嘉兴做网站设计
  • 如何制作营销网站模板做外贸需要关注的网站有什么好处
  • 东莞勒流网站制作wordpress 自定义字段 查询
  • 温州网站开发风格做影视剧组演员垂直平台网站
  • c 网站开发培训怎么做网站的站点地图
  • html 网站模板简单网站制作北京海淀
  • 大庆做网站找谁珠海网站搭建
  • 网站建设方面的外文宿迁房产网找房
  • 运营 网站遵义网站开发制作公司
  • 动力论坛源码网站后台地址是什么网站上微信支付功能
  • 网站需求分析模板深圳3d制作
  • 宿迁网站建设推广公司wordpress忘记密码了