范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JVM调优的ampampquot标准参数ampampquot的各种陷阱和坑点分析

  【易错问题】Major GC和Full GC的区别是什么?触发条件呢?
  相信大多数人的理解是Major GC只针对老年代,Full GC会先触发一次Minor GC,不知对否?我参考了R大的分析和介绍,总结了一下相关的说明和分析结论。在基于HotSpotVM的基础角度
  针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:Partial GC(部分回收模式)
  Partial GC代表着并不收集整个GC堆的模式Young Generation GC(新生代回收模式):它主要是进行回收新生代范围内的内存对象的GC回收器。Old/Tenured Generation GC(老年代回收模式):它主要是针对于回收老年代Old/Tenured Generation范围内的GC垃圾回收器(CMS的Concurrent Collection是这个模式)。Mixed Generation GC(混合代回收模式):收集整个young gen以及部分old gen的GC。只有G1有这个模式Full GC(全体回收模式)
  Full GC代表着收集整个JVM的运行时堆+方法区+直接堆外内存的总体范围内。(甚至可以理解为JVM进程范围内的绝大部分范围的数据区域)。
  它会涵盖了所有的模式和区域包含:Young Gen(新生代)、Tenured Gen(老生代)、Perm/Meta Gen(元空间)(JDK8前后的版本)等全局范围的GC垃圾回收模式。
  在一般情况下Major GC通常是跟Full GC是等价的,收集整个GC堆。但如果从HotSpot VM底层的细节出发,如果再有人说"Major GC"的时候一定要问清楚他想要指的是上面的Full GC还是Old/Tenured GC。基于最简单的分代式GC策略触发条件是:Young GC
  按HotSpot VM的Serial GC的实现来看,当Young gen中的Eden区分达到阈值(属于一定的百分比进行控制)的时候触发。
  注意:Young GC中有部分存活对象会晋升到Old/Tenured Gen,所以Young GC后Old Gen的占用量通常会有所升高。触发条件是:Full GC当准备要触发一次Young GC时,如果发现统计数据说之前Young Old/Tenured Gen剩余的空间大,则不会触发Young GC,而是转为触发Full GC(因为HotSpot VM的GC里,除了CMS的Concurrent collection之外,其它能收集Old/Tenured Gen的GC都会同时收集整个GC堆,包括Young gen,所以不需要事先触发一次单独的Young GC);如果有Perm/Meta gen的话,要在Perm/Meta gen分配空间但已经没有足够空间时,也要触发一次full GC。System.gc()方法或者Heap Dump自带的GC,默认也是触发Full GC。HotSpot VM里其它非并发GC的触发条件复杂一些,不过大致的原理与上面说的其实一样。
  注意:Parallel Scavenge(-XX:+UseParallelGC)框架下,默认是在要触发Full GC前先执行一次Young GC,并且两次GC之间能让应用程序稍微运行一小下,以期降低Full GC的暂停时间(因为young GC会尽量清理了Young Gen的垃圾对象,减少了Full GC的扫描工作量)。控制这个行为的VM参数是-XX:+ScavengeBeforeFullGC。触发条件是:Concurrent GC
  Concurrent GC的触发条件就不太一样。以CMS GC为例,它主要是定时去检查Old Gen的使用量,当使用量超过了触发比例就会启动一次CMS GC,对Old gen做并发收集。GC回收器对应的GC模式列举
  在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;Serial GC算法:Serial Young GC   Serial Old GC (实际上它是全局范围的Full GC);Parallel GC算法:Parallel Young GC   非并行的PS MarkSweep GC / 并行的Parallel Old GC(这俩实际上也是全局范围的Full GC),选PS MarkSweep GC 还是 Parallel Old GC 由参数UseParallelOldGC来控制;CMS算法:ParNew(Young)GC + CMS(Old)GC (piggyback on ParNew的结果/老生代存活下来的object只做记录,不做compaction)  Full GC for CMS算法(应对核心的CMS GC某些时候的不赶趟,开销很大);G1 GC:Young GC + mixed GC(新生代,再加上部分老生代)  Full GC for G1 GC算法(应对G1 GC算法某些时候的不赶趟,开销很大);GC回收模式的触发总结搞清楚了上面这些组合,我们再来看看各类GC算法的触发条件。简单说,触发条件就是某GC算法对应区域满了,或是预测快满了。比如, 各种Young GC的触发原因都是eden区满了; Serial Old GC/PS MarkSweep GC/Parallel Old GC的触发则是在要执行Young GC时候预测其promote的object的总size超过老生代剩余size; CMS GC的initial marking的触发条件是老生代使用比率超过某值; G1 GC的initial marking的触发条件是Heap使用比率超过某值; Full GC for CMS算法和Full GC for G1 GC算法的触发原因很明显,就是4.3 和 4.4 的fancy算法不赶趟了,只能全局范围大搞一次GC了(相信我,这很慢!这很慢!这很慢!);【坑点与坑点】-XX:+DisableExplicitGC 与 NIO的direct memory的关系
  很多人都见过JVM调优建议里使用这个参数,对吧?但是为什么要用它,什么时候应该用而什么时候用了会掉坑里呢?首先,要了解的是这个参数的作用。在Oracle/Sun JDK这个具体实现上,System.gc()的默认效果是引发一次stop-the-world的Full GC,由上面所知就是针对于整个GC堆做内存垃圾收集。再次,如果采用了用了-XX:+DisableExplicitGC参数后,System.gc()的调用就会变成一个空调用,完全不会触发任何GC(但是"函数调用"本身的开销还是存在的哦 )。为啥要用这个参数呢?最主要的原因是为了防止某些小白同学在代码里到处写System.gc()的调用而干扰了程序的正常运行吧。 有些应用程序本来可能正常跑一天也不会出一次Full GC,但就是因为有人在代码里调用了System.gc()而不得不间歇性被暂停。 有些时候这些调用是在某些库或框架里写的,改不了它们的代码但又不想被这些调用干扰也会用这参数。-XX:+DisableExplicitGC看起来这参数应该总是开着嘛。有啥坑呢?下述三个条件同时满足时会发生的应用本身在GC堆内的对象行为良好,正常情况下很久都不发生Full GC。应用大量使用了NIO的direct memory,经常、反复的申请DirectByteBuffer。使用了-XX:+DisableExplicitGC。能观察到的现象是:java.lang.OutOfMemoryError: Direct buffer memory       at java.nio.Bits.reserveMemory(Bits.java:633)       at java.nio.DirectByteBuffer.(DirectByteBuffer.java:98)       at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)   复制代码用一个案例来分析这现象:import java.nio.*;   public class DisableExplicitGCDemo {     public static void main(String[] args) {       for (int i = 0; i < 100000; i++) {         ByteBuffer.allocateDirect(128);       }       System.out.println("Done");     }   }   复制代码
  然后编译、运行。$ java -version   java version "1.6.0_25"   Java(TM) SE Runtime Environment (build 1.6.0_25-b06)   Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)   $ javac DisableExplicitGCDemo.java    $ java -XX:MaxDirectMemorySize=10m -XX:+PrintGC -XX:+DisableExplicitGC DisableExplicitGCDemo Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory       at java.nio.Bits.reserveMemory(Bits.java:633)       at java.nio.DirectByteBuffer.(DirectByteBuffer.java:98)       at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)       at DisableExplicitGCDemo.main(DisableExplicitGCDemo.java:6)   $ java -XX:MaxDirectMemorySize=10m -XX:+PrintGC DisableExplicitGCDemo   [GC 10996K->10480K(120704K), 0.0433980 secs]   [Full GC 10480K->10415K(120704K), 0.0359420 secs]   Done   复制代码可以看到,同样的程序,不带-XX:+DisableExplicitGC时能正常完成运行,而带上这个参数后却出现了OOM。-XX:MaxDirectMemorySize=10m限制了DirectByteBuffer能分配的空间的限额,以便问题更容易展现出来。不用这个参数就得多跑一会儿了。循环不断申请DirectByteBuffer但并没有引用,所以这些DirectByteBuffer应该刚创建出来就已经满足被GC的条件,等下次GC运行的时候就应该可以被回收。实际上却没这么简单。DirectByteBuffer是种典型的"冰山"对象,也就是说它的Java对象虽然很小很无辜,但它背后却会关联着一定量的native memory资源,而这些资源并不在GC的控制之下,需要自己注意控制好。
  对JVM如何使用native memory不熟悉的同学可以研究一下这篇演讲,"Where Does All the Native Memory Go"。【盲点问题】DirectByteBuffer的回收问题
  Oracle/Sun JDK的实现里,DirectByteBuffer有几处值得注意的地方。DirectByteBuffer没有finalizer,它的native memory的清理工作是通过sun.misc.Cleaner自动完成的。sun.misc.Cleaner是一种基于PhantomReference的清理工具,比普通的finalizer轻量些。
  "A cleaner tracks a referent object and encapsulates a thunk of arbitrary cleanup code. Some time after the GC detects that a cleaner"s referent has become phantom-reachable, the reference-handler thread will run the cleaner."源码注释/**   * General-purpose phantom-reference-based cleaners.   *   * 

Cleaners are a lightweight and more robust alternative to finalization. * They are lightweight because they are not created by the VM and thus do not * require a JNI upcall to be created, and because their cleanup code is * invoked directly by the reference-handler thread rather than by the * finalizer thread. They are more robust because they use phantom references, * the weakest type of reference object, thereby avoiding the nasty ordering * problems inherent to finalization. * *

A cleaner tracks a referent object and encapsulates a thunk of arbitrary * cleanup code. Some time after the GC detects that a cleaner"s referent has * become phantom-reachable, the reference-handler thread will run the cleaner. * Cleaners may also be invoked directly; they are thread safe and ensure that * they run their thunks at most once. * *

Cleaners are not a replacement for finalization. They should be used * only when the cleanup code is extremely simple and straightforward. * Nontrivial cleaners are inadvisable since they risk blocking the * reference-handler thread and delaying further cleanup and finalization. * * * @author Mark Reinhold * @version %I%, %E% */ 复制代码   Oracle/Sun JDK中的HotSpot VM只会在Old Gen GC(Full GC/Major GC或者Concurrent GC都算)的时候才会对Old Gen中的对象做Reference Processing,而在Young GC/Minor GC时只会对Young Gen里的对象做Reference processing。Full GC会对Old Gen做Reference processing,进而能触发Cleaner对已死的DirectByteBuffer对象做清理工作。如果很长一段时间里没做过GC或者只做了Young GC的话则不会在Old Gen触发Cleaner的工作,那么就可能让本来已经死了的、但已经晋升到Old Gen的DirectByteBuffer关联的Native Memory得不到及时释放。为DirectByteBuffer分配空间过程中会显式调用System.gc(),以通过Full GC来强迫已经无用的DirectByteBuffer对象释放掉它们关联的native memory。// These methods should be called whenever direct memory is allocated or // freed. They allow the user to control the amount of direct memory // which a process may access. All sizes are specified in bytes. static void reserveMemory(long size) { synchronized (Bits.class) { if (!memoryLimitSet && VM.isBooted()) { maxMemory = VM.maxDirectMemory(); memoryLimitSet = true; } if (size <= maxMemory - reservedMemory) { reservedMemory += size; return; } } System.gc(); try { Thread.sleep(100); } catch (InterruptedException x) { // Restore interrupt status Thread.currentThread().interrupt(); } synchronized (Bits.class) { if (reservedMemory + size > maxMemory) throw new OutOfMemoryError("Direct buffer memory"); reservedMemory += size; } } 复制代码总结分析   这几个实现特征使得Oracle/Sun JDK依赖于System.gc()触发GC来保证DirectByteMemory的清理工作能及时完成。   如果打开了-XX:+DisableExplicitGC,清理工作就可能得不到及时完成,于是就有机会见到direct memory的OOM,也就是上面的例子演示的情况。我们这边在实际生产环境中确实遇到过这样的问题。   如果你在使用Oracle/Sun JDK,应用里有任何地方用了direct memory,那么使用-XX:+DisableExplicitGC要小心。如果用了该参数而且遇到direct memory的OOM,可以尝试去掉该参数看是否能避开这种OOM。如果担心System.gc()调用造成Full GC频繁,可以尝试下面提到 -XX:+ExplicitGCInvokesConcurrent 参数   原文链接:https://juejin.cn/post/7177565339801092152


冯建峰科研是第一快乐的事来源人民日报冯建峰在科研讨论班讲课。资料照片冯建峰(中)在参与实验数据分析。资料照片人物名片冯建峰1964年生,长江学者特聘教授,现任上海数学中心首席教授复旦大学类脑智能科学与技术activiti7。1。0。M6(七)获取流程审批图片,高亮显示根据流程实例Id,获取实时流程图片paramprocessInstanceIdparamparamuseCustomColortrue用自定义的颜色(完成节点绿色,当前节点红色),前瞻美联储决议GDP负增长无阻激进加息,经济衰退可否避免?当地时间3日,美联储开启为期两天的议息会议。静默期前,多位官员密集放鹰为此次会议定调,市场普遍预期,加息50个基点已经板上钉钉,这将是2000年以来美联储首度一次性加息50个基点。未来2年全球继续缺芯,ASML高管中芯国际2023年产能被抢光近年来由于美国不断施压,试图利用芯片对我们卡脖子,导致许多国民对半导体行业异常关注。特别是自从贸易战爆发后,美国挑起的一系列争端,导致全球芯片产能持续紧张,多家制造商都不得不大规模加息靴子落地,5月市场怎么走?明天就要开市了,经过5天的时间修整,市场整体情绪会更加理性,那么节中的几个重要信息可能会影响到开盘后甚至整个5月份的走势1大感冒的防控已经有明显成效,拐点在节前就已经达到,这对于经当网课大潮退去,佛系上课和假装努力的孩子,都输了作者主创团猪妈妈前几天刷视频,看到一位妈妈,在家陪孩子上了三天网课后,情绪崩溃,哭得梨花带雨。原来,孩子上课时,一步跟不上,步步跟不上老师说把课本翻到哪一页,孩子根本找不到。她就眼烟火气里的仪式感露营式社交成年轻人新宠中新社南京5月4日电题烟火气里的仪式感露营式社交成年轻人新宠作者徐珊珊一顶帐篷,一片天空,在向往的生活里找寻另一个自我当下,户外露营异军突起一篷难求,露营式社交逐渐升温,成为热门的中国乳业一超多强格局已定伊利下一步要做什么?作者木宁来源铑财铑财研究院在足球篮球等体育联赛中,球员一般被划为三等级普通球员明星球员超级巨星。普通球员,即能力达到联赛平均水平明星球员,是某一或某些方面有突出或领先优势。超级巨星与星辰同行,一次全程走心的自驾游之旅把春天装进旅途自从拥有五菱星辰后,我就爱上了周边打卡,这不,趁着周末,我又拉着闺蜜去了我们这的网红景点,一路上我们感觉很放松,累了就直接语音让午菱星辰放几首动感的摇滚。全系1。5t塔克离开雄鹿是因为不被尊重即使少拿钱也不愿留在那里直播吧5月4日讯今日,Andscape记者MarcJ。Spears在文章中发布了热火队员PJ塔克的电话采访细节(该电话采访发生在热火和76人的第二轮系列赛首场比赛之前)。记者问我很欧冠皇家马德里VS曼城最远的距离是一个球五万人的小城大事,输了比赛赢了全世界。我爱你不后悔,也尊重故事的结尾?别这样,那时我们有梦,关于半决赛,关于黄色潜水艇,关于穿越尤文和拜仁的旅行如今我们深夜饮酒,杯子碰到一起,都是
曾是中国第二大城市,经济实力不输北上广,可如今却还不如杭州?天津市,是中国北方的一个重要城市,也是华北地区的经济中心之一。自2009年被国家正式列为国家中心城市群之一以来,天津市的经济实力一直在稳步增长。然而,最近几年,天津市的GDP增速出太极与音乐跨界活动在纽约举办中国山东网感知山东3月6日讯(记者袁文卿通讯员吴晓丽)为弘扬中华武术传统文化,在国际上更好的推广和传播世界非遗武术太极拳,太极拳大师任广义,与艺术家及音乐家LaurieAnders军歌,我一生的背景音乐每次唱卡拉OK,我都不爱随大流唱那些港台流行歌曲,就爱挑军歌过瘾。只要一唱起那些阳刚的军歌,总是那么投入,那么深情。那一瞬间,重温旧梦,恍如隔世。那些逝去的少年时光和青春岁月,悄然节奏慢剧情弱,这些硬伤剧是怎么火的?作者顾韩编辑李春晖很长一段时间里,节奏飞快毫不拖泥带水都是最好用的剧集安利话术。相应的,慢的赶客效果也是十足十。多少制作精良的大剧都被一个慢字拖累,成了只配给剪刀手贡献绝美空镜的素2023年想去云南住几周,感受慢节奏生活,有哪些地方值得推荐?两年前,跟许红豆一样,厌倦了大城市无休止的卷,我们选择来到大理放松一下紧绷的生活。本来只打算待两三个月,没想到一待就是两年。最近电视剧热播,总是有朋友会发信息来问大理真的有许红豆住Realme手机再好也别乱买,这3款才值得入手,用过几乎都说好作为OPPO手机子品牌的Realme真我手机,最近几年非常火热,今天就来推荐这几款。真我10pro参考售价1699推荐理由天玑1080处理器,最大12GB256GB的大内存组合配合最值得入手的三款超高性价比平板推荐,你最看好哪一款?如果您喜欢我的文章,欢迎您点击左上角的关注后续将第一时间为您带来最新手机资讯!现在平板电脑市场上各种平板电脑越来越多,让很多人都挑花了眼。那平板电脑到底应该怎么选呢?接下来我来为大两会后关注这个板块(中特估军工卫星芯片6G高空数据链)中国特色估值体系的提出,本质上是中国优势资产重估。中特估相关概念中铁装配中公高科中成股份中船科技中粮科工中国卫通中天火箭中国交建中国海诚中远海特中国科传等涉及基建航运卫星军工多个不非暴力沟通,是AI难以替代的本领随着中国版chatGPT的到来,今后我们更多的对话场景将会是人与AI进行,比如促销电话售后咨询程序化较高的业务柜台等服务都会被人工智能所取代,那么,人与人之间面对面的沟通真的没有必南财基金通混合型基金收益排行榜(3月6日)南方财经3月7日电,根据南财基金通数据2023年3月6日当日收益较高的混合型基金包括东方人工智能主题混合型证券投资基金(005844,日收益4。01)中信建投低碳成长混合型证券投资推进新能源汽车充电网建设破解充电难题2022年,我国新能源汽车呈现高速增长态势,充电基础设施业务面临新挑战新机遇。全国政协委员,恒银金融科技股份有限公司党委书记董事长江浩然发现,目前,公共充电桩能够基本满足运营类车辆