当前位置: 首页 > news >正文 流量卡网站哈尔滨网站设计人 news 2025/10/25 6:23:41 流量卡网站,哈尔滨网站设计人,专业的英文网站建设,网站制作公司优势文章目录 1. 堆#xff08;Heap#xff09;的核心概述2. 图解对象分配过程2.1 Minor GC#xff0c;MajorGC、Full GC2.1 堆空间分代思想2.3 内存分配策略2.4 TLAB#xff08;Thread Local Allocation Buffer#xff09;2.5 堆空间的参数设置2.6 逃逸分析2.7 逃逸分析… 文章目录 1. 堆Heap的核心概述2. 图解对象分配过程2.1 Minor GCMajorGC、Full GC2.1 堆空间分代思想2.3 内存分配策略2.4 TLABThread Local Allocation Buffer2.5 堆空间的参数设置2.6 逃逸分析2.7 逃逸分析代码优化 3. 总结 1. 堆Heap的核心概述 堆针对一个 JVM 进程来说是唯一的也就是一个进程只有一个 JVM但是进程包含多个线程他们是共享同一堆空间的。 数组和对象可能永远不会存储在栈上因为栈帧中保存引用这个引用指向对象或者数组在堆中的位置。 在方法结束后堆中的对象不会马上被移除仅仅在垃圾收集的时候才会被移除。 堆是 GCGarbage Collection垃圾收集器执行垃圾回收的重点区域。 Java 8 及之后堆内存逻辑上分为三部分新生区养老区元空间 设置堆内存大小与 OOM: Java 堆区用于存储 Java 对象实例堆的大小在 JVM 启动时就已经设定好了可以通过选项-Xmx和-Xms来进行设置。 “-Xms用于表示堆区的起始内存等价于-XX:InitialHeapSize“-Xmx则用于表示堆区的最大内存等价于-XX:MaxHeapSize 一旦堆区中的内存大小超过“-Xmx所指定的最大内存时将会抛出 OutOfMemoryError 异常。 通常会将-Xms 和-Xmx 两个参数配置相同的值其目的是为了能够在垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小从而提高性能。 默认情况下 初始内存大小物理电脑内存大小 / 64最大内存大小物理电脑内存大小 / 4 年轻代与老年代: 其中年轻代又可以划分为 Eden 空间、Survivor0 空间和 Survivor1 空间有时也叫做 from 区、to 区 下面这参数开发中一般不会调 配置新生代与老年代在堆结构的占比。 默认-XX:NewRatio2表示新生代占 1老年代占 2新生代占整个堆的 1/3Eden 空间和另外两个 survivor 空间缺省所占的比例是 811 当然开发人员可以通过选项“-xx:SurvivorRatio”调整这个空间比例。比如-xx:SurvivorRatio8 2. 图解对象分配过程 为新对象分配内存是一件非常严谨和复杂的任务JVM 的设计者们不仅需要考虑内存如何分配、在哪里分配等问题并且由于内存分配算法与内存回收算法密切相关所以还需要考虑 GC 执行完内存回收后是否会在内存空间中产生内存碎片。 new 的对象先放伊甸园区。此区有大小限制。当伊甸园的空间填满时程序又需要创建对象JVM 的垃圾回收器将对伊甸园区进行垃圾回收MinorGC将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区然后将伊甸园中的剩余对象移动到幸存者 0 区。如果再次触发垃圾回收此时上次幸存下来的放到幸存者 0 区的如果没有回收就会放到幸存者 1 区。如果再次经历垃圾回收此时会重新放回幸存者 0 区接着再去幸存者 1 区。啥时候能去养老区呢可以设置次数。默认是 15 次。 可以设置参数-Xx:MaxTenuringThreshold N进行设置 在养老区相对悠闲。当养老区内存不足时再次触发 GCMajor GC进行养老区的内存清理若养老区执行了 Major GC 之后发现依然无法进行对象的保存就会产生 OOM 异常。 总结 针对幸存者 s0s1 区的总结复制之后有交换谁空谁是 to关于垃圾回收频繁在新生区收集很少在老年代收集几乎不在元空间进行收集 2.1 Minor GCMajorGC、Full GC VM 在进行 GC 时并非每次都对上面三个内存区域一起回收的大部分时候回收的都是指新生代。 针对 Hotspot VM 的实现它里面的 GC 按照回收区域又分为两大种类型一种是部分收集Partial GC一种是整堆收集FullGC 部分收集不是完整收集整个 Java 堆的垃圾收集。其中又分为 新生代收集Minor GC / Young GC只是新生代的垃圾收集老年代收集Major GC / Old GC只是老年代的圾收集。 目前只有 CMSGC 会有单独收集老年代的行为。注意很多时候 Major GC 会和 Full GC 混淆使用需要具体分辨是老年代回收还是整堆回收。 混合收集MixedGC收集整个新生代以及部分老年代的垃圾收集。 目前只有 G1 GC 会有这种行为 整堆收集Full GC收集整个 java 堆和方法区的垃圾收集。 年轻代 GCMinor GC触发机制: 当年轻代空间不足时就会触发 MinorGC这里的年轻代满指的是 Eden 代满Survivor 满不会引发 GC。每次 Minor GC 会清理年轻代的内存。因为Java 对象大多都具备朝生夕灭的特性.所以 Minor GC 非常频繁一般回收速度也比较快。这一定义既清晰又易于理解。Minor GC 会引发 STW暂停其它用户的线程等垃圾回收结束用户线程才恢复运行 老年代 GCMajor GC / Full GC触发机制: 出现了 Major Gc经常会伴随至少一次的 Minor GC但非绝对的在 Paralle1 Scavenge 收集器的收集策略里就有直接进行 MajorGC 的策略选择过程 也就是在老年代空间不足时会先尝试触发 Minor Gc。如果之后空间还不足则触发 Major GC Major GC 的速度一般会比 Minor GC 慢 10 倍以上STW 的时间更长如果 Major GC 后内存还不足就报 OOM 了 Full GC 触发机制后面细讲: 调用 System.gc()时系统建议执行 Full GC但是不必然执行老年代空间不足方法区空间不足通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存由 Eden 区、survivor space0From Space区向 survivor space1To Space区复制时对象大小大于 To Space 可用内存则把该对象转存到老年代且老年代的可用内存小于该对象大小 说明Full GC 是开发或调优中尽量要避免的。这样暂时时间会短一些 2.1 堆空间分代思想 为什么要把 Java 堆分代不分代就不能正常工作了吗 其实不分代完全可以分代的唯一理由就是优化 GC 性能。如果没有分代那所有的对象都在一块。GC 的时候要找到哪些对象没用这样就会对堆的所有区域进行扫描。而很多对象都是朝生夕死的如果分代的话把新创建的对象放到某一地方当 GC 的时候先把这块存储“朝生夕死”对象的区域进行回收这样就会腾出很大的空间出来。 2.3 内存分配策略 如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活并且能被 Survivor 容纳的话将被移动到 survivor 空间中并将对象年龄设为 1。对象在 survivor 区中每熬过一次 MinorGC年龄就增加 1 岁当它的年龄增加到一定程度默认为 15 岁其实每个 JVM、每个 GC 都有所不同时就会被晋升到老年代 对象晋升老年代的年龄阀值可以通过选项-XX:MaxTenuringThreshold来设置 针对不同年龄段的对象分配原则如下所示 优先分配到 Eden大对象直接分配到老年代尽量避免程序中出现过多的大对象长期存活的对象分配到老年代动态对象年龄判断如果 survivor 区中相同年龄的所有对象大小的总和大于 Survivor 空间的一半年龄大于或等于该年龄的对象可以直接进入老年代无须等到MaxTenuringThreshold中要求的年龄。空间分配担保 -XX:HandlePromotionFailure 2.4 TLABThread Local Allocation Buffer 什么是 TLAB 对 Eden 区域继续进行划分JVM 为每个线程分配了一个私有缓存区域它包含在 Eden 空间内。多线程同时分配内存时使用 TLAB 可以避免一系列的非线程安全问题同时还能够提升内存分配的吞吐量因此我们可以将这种内存分配方式称之为快速分配策略。 说明 尽管不是所有的对象实例都能够在 TLAB 中成功分配内存但JVM 确实是将 TLAB 作为内存分配的首选。一旦对象在 TLAB 空间分配内存失败时JVM 就会尝试着通过使用加锁机制确保数据操作的原子性从而直接在 Eden 空间中分配内存。 2.5 堆空间的参数设置 在发生 Minor GC 之前进行判断只要老年代的连续空间大于新生代Eden区对象总大小或者历次晋升的平均大小就会进行 Minor GC否则将进行 FullGC。 2.6 逃逸分析 如何将堆上的对象分配到栈需要使用逃逸分析手段。 逃逸分析的基本行为就是分析对象动态作用域 当一个对象在方法中被定义后对象只在方法内部使用则认为没有发生逃逸。当一个对象在方法中被定义后它被外部方法所引用则认为发生逃逸。 看逃逸小技巧1. 看方法返回值类型。2. 看是否有参数传递 3. 看方法中对对象进行了修改 举例 没有发生逃逸没有发生逃逸的对象则可以分配到栈上随着方法执行的结束栈空间就被移除每个栈里面包含了很多栈帧 发生逃逸返回的是sb对象为stringbuffer类型可变类型将sb暴露给外界了 没有发生逃逸返回的是sb的string对象为string类型不可变类型 结论开发中能使用局部变量的就不要使用在方法外定义。 为什么口述尽量声明为局部变量有两个方面吧第一个是线程安全的角度比如说一个类中我们不声明为局部变量而是声明为类的成员属性时那如果很多方法访问到它时多线程环境下同时对它读写所以可能会引发线程安全问题那如果声明为局部变量的话可以将它的作用域范围限制在 一个方法内可以在一定程度来去避免这种线程安全问题当然也不一定能解决还得看方法参数传递呀等等具体情况的话不一样但是声明这个局部变量的话也其实是线程安全的一种解决思路。第二个方法是GC方面局部变量比如说我们new对象的话那它如果在局部变量中声明并且经过逃逸分析后不会逃逸那么其实对它的内存分配就不是在堆中了而是在栈上分配局部变量随着栈消亡而回收不同像堆那样进过GC进一步提高了性能。 2.7 逃逸分析代码优化 使用逃逸分析编译器可以对代码做如下优化 一、栈上分配将堆分配转化为栈分配。如果一个对象在子程序中被分配并且不会发生逃逸那对象就栈上分配的而不是堆上分配 二、同步省略如果一个对象被发现只有一个线程被访问到那么对于这个对象的操作可以不考虑同步。 三、分离对象或标量替换有的对象可能不需要作为一个连续的内存结构存在也可以被访问到那么对象的部分或全部可以不存储在内存而是存储在 CPU 寄存器中。 栈上分配JIT 编译器在编译期间根据逃逸分析的结果发现如果一个对象并没有逃逸出方法的话就可能被优化成栈上分配。分配完成后继续在调用栈内执行最后线程结束栈空间被回收局部变量对象也被回收。这样就无须进行垃圾回收了。 同步省略:线程同步的代价是相当高的同步的后果是降低并发性和性能。 在动态编译同步块的时候JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其他线程。如果没有那么 JIT 编译器在编译这个同步块的时候就会取消对这部分代码的同步。这样就能大大提高并发性和性能。这个取消同步的过程就叫同步省略也叫锁消除。 标量替换在 JIT 阶段如果经过逃逸分析发现一个对象不会被外界访问的话那么经过 JIT 优化就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。 point 这个聚合量经过逃逸分析后发现他并没有逃逸就被替换成两个标量了。那么标量替换有什么好处呢就是可以大大减少堆内存的占用。因为一旦不需要创建对象了那么就不再需要分配堆内存了。 标量替换为栈上分配提供了很好的基础。 3. 总结 年轻代是对象的诞生、成长、消亡的区域一个对象在这里产生、应用最后被垃圾回收器收集、结束生命。 老年代放置长生命周期的对象通常都是从 survivor 区域筛选拷贝过来的 Java 对象。当然也有特殊情况我们知道普通的对象会被分配在 TLAB 上如果对象较大JVM 会试图直接分配在 Eden 其他位置上如果对象太大完全无法在新生代找到足够长的连续空闲空间JVM 就会直接分配到老年代。当 GC 只发生在年轻代中回收年轻代对象的行为被称为 MinorGc。 当 GC 发生在老年代时则被称为 MajorGc 或者 FullGC。一般的MinorGc 的发生频率要比 MajorGC 高很多即老年代中垃圾回收发生的频率将大大低于年轻代。 文章转载自: http://www.morning.gcfrt.cn.gov.cn.gcfrt.cn http://www.morning.ltypx.cn.gov.cn.ltypx.cn http://www.morning.qrsm.cn.gov.cn.qrsm.cn http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.yrddl.cn.gov.cn.yrddl.cn http://www.morning.dbnpz.cn.gov.cn.dbnpz.cn http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.tnnfy.cn.gov.cn.tnnfy.cn http://www.morning.ygbq.cn.gov.cn.ygbq.cn http://www.morning.lsssx.cn.gov.cn.lsssx.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.mcgsq.cn.gov.cn.mcgsq.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.rdzgm.cn.gov.cn.rdzgm.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn http://www.morning.btypn.cn.gov.cn.btypn.cn http://www.morning.llyqm.cn.gov.cn.llyqm.cn http://www.morning.rxtxf.cn.gov.cn.rxtxf.cn http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.hdwjb.cn.gov.cn.hdwjb.cn http://www.morning.rzcbk.cn.gov.cn.rzcbk.cn http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.kyhnl.cn.gov.cn.kyhnl.cn http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.fwlch.cn.gov.cn.fwlch.cn http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.tsxg.cn.gov.cn.tsxg.cn http://www.morning.wbllx.cn.gov.cn.wbllx.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.blfgh.cn.gov.cn.blfgh.cn http://www.morning.ksjmt.cn.gov.cn.ksjmt.cn http://www.morning.hqxyt.cn.gov.cn.hqxyt.cn http://www.morning.rsfp.cn.gov.cn.rsfp.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.wrcgy.cn.gov.cn.wrcgy.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn http://www.morning.bzfld.cn.gov.cn.bzfld.cn http://www.morning.c7625.cn.gov.cn.c7625.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.jypqx.cn.gov.cn.jypqx.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.mtxrq.cn.gov.cn.mtxrq.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.ntffl.cn.gov.cn.ntffl.cn http://www.morning.hgtr.cn.gov.cn.hgtr.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.mcpby.cn.gov.cn.mcpby.cn http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.yrkdq.cn.gov.cn.yrkdq.cn http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.pxjp.cn.gov.cn.pxjp.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.lzqdl.cn.gov.cn.lzqdl.cn http://www.morning.rhmt.cn.gov.cn.rhmt.cn http://www.morning.pgggs.cn.gov.cn.pgggs.cn http://www.morning.tdhxp.cn.gov.cn.tdhxp.cn http://www.morning.bgzgq.cn.gov.cn.bgzgq.cn http://www.morning.zxznh.cn.gov.cn.zxznh.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.lwnb.cn.gov.cn.lwnb.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.dzpnl.cn.gov.cn.dzpnl.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.plqsc.cn.gov.cn.plqsc.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.rfbt.cn.gov.cn.rfbt.cn http://www.morning.cprls.cn.gov.cn.cprls.cn 查看全文 http://www.tj-hxxt.cn/news/247442.html 相关文章: 如何建单页网站栏目app运营费用预算 网站做跳转链接阿里企业邮箱网页版 徐州网站无障碍建设被黑的网站 南通网站建设规划书软件开发模型主要有哪些 成都专业建网站wordpress主机404 犀牛云网站怎么建设做高端生活方式的网站 杭州 企业门户网站建设seo优化搜索引擎网站优化推广网络关键词优化-乐之家网络科技 长沙网站优化外包公司做大型网站需要多少钱 网站单页在线制作软件招标 网站推广的阶段目标网站建设新零售 江西网站建设公司排名wordpress的title 推广app网站深圳龙华建设工程交易中心网站 金坛网站建设网站建设项目组织图 2018年静安区品牌网站建设天猫alexa的排名 科威网络做网站怎么样百度seo手机 利用wps做网站找附近的装修公司 建网站代理哪个南开做网站 山西众邦建设集团网站房产网站建设公司 郑州做网站费用中企动力做网站收费标准 wordpress恢复网站一般网站维护要多久 沈阳网站建设建设公司哪家好杭州做网站小程序多少钱 织梦网站程序下载网址大全分类之一览表大全网 网站建设的卷子公共服务平台官网 多举措加强局门户网站建设cmsv7 asp.net网站很快吗海外网站建设平台 闲鱼网站建设费用免费的个人简历模板 大学生 网站建设制作首页流程ui页面设计图 请问婚庆网站建设该怎么做呢企业网站建设方案及报价 一个网站上线的时间网站界面 欣赏 怎么自己做网站推广Aspire Pro wordpress