专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

生产环境如何排除和优化JVM?

  通过前面几个课时的学习,相信你对JVM的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解JVM的排查与优化,这样就会对JVM的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。
  我们本课时的面试题是,生产环境如何排查问题?典型回答
  如果是在生产环境中直接排查JVM的话,最简单的做法就是使用JDK自带的6个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat和jstack,它们都位于JDK的bin目录下,可以使用命令行工具直接运行,其目录如下图所示:
  1。jps(虚拟机进程状况工具)
  jps(JVMProcessStatustool,虚拟机进程状况工具)它的功能和Linux中的ps命令比较类似,用于列出正在运行的JVM的LVMID(LocalVirtualMachineIDentifier,本地虚拟机唯一ID),以及JVM的执行主类、JVM启动参数等信息。语法如下:jps〔options〕〔hostid〕
  常用的options选项:l:用于输出运行主类的全名,如果是jar包,则输出jar包的路径;q:用于输出LVMID(LocalVirtualMachineIdentifier,虚拟机唯一ID);m:用于输出虚拟机启动时传递给主类main()方法的参数;v:用于输出启动时的JVM参数。2。jstat(虚拟机统计信息监视工具)
  jstat(JVMStatisticsMonitoringTool,虚拟机统计信息监视工具)用于监控虚拟机的运行状态信息。
  例如,我们用它来查询某个Java进程的垃圾收集情况,示例如下:jstatgc43704S0CS1CS0US1UECEUOCOUMCMUCCSCCCSUYGCYGCTFGCFGCTCGCCGCTGCT10752。010752。00。00。065536。05243。4175104。00。04480。0774。0384。075。800。00000。0000。000
  参数说明如下表所示:
  参数
  说明
  S0C
  年轻代中第一个存活区的大小
  S1C
  年轻代中第二个存活区的大小
  S0U
  年轻代中第一个存活区已使用的空间(字节)
  S1U
  年轻代中第二个存活区已使用的空间(字节)
  EC
  Edem区大小
  EU
  年轻代中Edem区已使用的空间(字节)
  OC
  老年代大小
  OU
  老年代已使用的空间(字节)
  YGC
  从应用程序启动到采样时younggc的次数
  YGCT
  从应用程序启动到采样时younggc的所用的时间(s)
  FGC
  从应用程序启动到采样时fullgc的次数
  FGCT
  从应用程序启动到采样时fullgc的所用的时间
  GCT
  从应用程序启动到采样时整个gc所用的时间
  注意:年轻代的Edem区满了会触发younggc,老年代满了会触发oldgc。fullgc指的是清除整个堆,包括young区和old区。
  jstat常用的查询参数有:class,查询类加载器信息;compiler,JIT相关信息;gc,GC堆状态;gcnew,新生代统计信息;gcutil,GC堆统计汇总信息。3。jinfo(查询虚拟机参数配置工具)
  jinfo(ConfigurationInfoforJava)用于查看和调整虚拟机各项参数。语法如下:jinfooptionpid
  查看JVM参数示例如下:jinfoflags45129VMFlags:XX:CICompilerCount3XX:InitialHeapSize268435456XX:MaxHeapSize4294967296XX:MaxNewSize1431306240XX:MinHeapDeltaBytes524288XX:NewSize89128960XX:OldSize179306496XX:UseCompressedClassPointersXX:UseCompressedOopsXX:UseFastUnorderedTimeStampsXX:UseParallelGC
  其中45129是使用jps查询的LVMID。
  我们可以通过jinfoflag〔〕name来修改虚拟机的参数值,比如下面的示例:jinfoflagPrintGC45129查询是否开启GC打印XX:PrintGCjinfoflagPrintGC45129开启GC打印jinfoflagPrintGC45129查询是否开启GC打印XX:PrintGCjinfoflagPrintGC45129关闭GC打印jinfoflagPrintGC45129查询是否开启GC打印XX:PrintGC4。jmap(堆快照生成工具)
  jmap(MemoryMapforJava)用于查询堆的快照信息。
  查询堆信息示例如下:jmapheap45129AttachingtoprocessID45129,pleasewait。。。Debuggerattachedsuccessfully。Servercompilerdetected。JVMversionis25。101b13usingthreadlocalobjectallocation。ParallelGCwith6thread(s)HeapConfiguration:MinHeapFreeRatio0MaxHeapFreeRatio100MaxHeapSize4294967296(4096。0MB)NewSize89128960(85。0MB)MaxNewSize1431306240(1365。0MB)OldSize179306496(171。0MB)NewRatio2SurvivorRatio8MetaspaceSize21807104(20。796875MB)CompressedClassSpaceSize1073741824(1024。0MB)MaxMetaspaceSize17592186044415MBG1HeapRegionSize0(0。0MB)HeapUsage:PSYoungGenerationEdenSpace:capacity67108864(64。0MB)used5369232(5。1204986572265625MB)free61739632(58。87950134277344MB)8。000779151916504usedFromSpace:capacity11010048(10。5MB)used0(0。0MB)free11010048(10。5MB)0。0usedToSpace:capacity11010048(10。5MB)used0(0。0MB)free11010048(10。5MB)0。0usedPSOldGenerationcapacity179306496(171。0MB)used0(0。0MB)free179306496(171。0MB)0。0used2158internedStringsoccupying152472bytes。
  我们也可以直接生成堆快照文件,示例如下:jmapdump:formatb,fileUsersadminDocuments2020。dump47380DumpingheaptoUsersadminDocuments2020。dump。。。Heapdumpfilecreated5。jhat(堆快照分析功能)
  jhat(JVMHeapAnalysisTool,堆快照分析工具)和jmap搭配使用,用于启动一个web站点来分析jmap生成的快照文件。
  执行示例如下:jhatUsersadminDocuments2020。dumpReadingfromUsersadminDocuments2020。dump。。。DumpfilecreatedTueMay2616:12:41CST2020Snapshotread,resolving。。。Resolving17797objects。。。Chasingreferences,expect3dots。。。Eliminatingduplicatereferences。。。Snapshotresolved。StartedHTTPserveronport7000Serverisready。
  上述信息表示jhat启动了一个http的服务器端口为7000的站点来展示信息,此时我们在浏览器中输入:http:localhost:7000,会看到如下图所示的信息:
  6。jstack(查询虚拟机当前的线程快照信息)
  jstack(StackTraceforJava)用于查看当前虚拟机的线程快照,用它可以排查线程的执行状况,例如排查死锁、死循环等问题。
  比如,我们先写一段死锁的代码:publicclassNativeOptimize{privatestaticObjectobj1newObject();privatestaticObjectobj2newObject();publicstaticvoidmain(String〔〕args){newThread(newRunnable(){Overridepublicvoidrun(){synchronized(obj2){System。out。println(Thread。currentThread()。getName()锁住obj2);try{Thread。sleep(1000);}catch(InterruptedExceptione){e。printStackTrace();}synchronized(obj1){执行不到这里System。out。println(1秒钟后,Thread。currentThread()。getName()锁住obj1);}}}})。start();synchronized(obj1){System。out。println(Thread。currentThread()。getName()锁住obj1);try{Thread。sleep(1000);}catch(InterruptedExceptione){e。printStackTrace();}synchronized(obj2){执行不到这里System。out。println(1秒钟后,Thread。currentThread()。getName()锁住obj2);}}}}
  以上程序的执行结果如下:
  main:锁住obj1
  Thread0:锁住obj2
  此时我们使用jstack工具打印一下当前线程的快照信息,结果如下:binjstackl500162020052618:01:41FullthreaddumpJavaHotSpot(TM)64BitServerVM(25。101b13mixedmode):AttachListener10daemonprio9osprio31tid0x00007f8c00840800nid0x3c03waitingoncondition〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneThread09prio5osprio31tid0x00007f8c00840000nid0x3e03waitingformonitorentry〔0x00007000100c8000〕java。lang。Thread。State:BLOCKED(onobjectmonitor)atcom。example。optimize。NativeOptimize1。run(NativeOptimize。java:25)waitingtolock0x000000076abb62d0(ajava。lang。Object)locked0x000000076abb62e0(ajava。lang。Object)atjava。lang。Thread。run(Thread。java:745)Lockedownablesynchronizers:NoneServiceThread8daemonprio9osprio31tid0x00007f8c01814800nid0x4103runnable〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneC1CompilerThread27daemonprio9osprio31tid0x00007f8c0283c800nid0x4303waitingoncondition〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneC2CompilerThread16daemonprio9osprio31tid0x00007f8c0300a800nid0x4403waitingoncondition〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneC2CompilerThread05daemonprio9osprio31tid0x00007f8c0283c000nid0x3603waitingoncondition〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneSignalDispatcher4daemonprio9osprio31tid0x00007f8c0283b000nid0x4603runnable〔0x0000000000000000〕java。lang。Thread。State:RUNNABLELockedownablesynchronizers:NoneFinalizer3daemonprio8osprio31tid0x00007f8c03001000nid0x5003inObject。wait()〔0x000070000f8ad000〕java。lang。Thread。State:WAITING(onobjectmonitor)atjava。lang。Object。wait(NativeMethod)waitingon0x000000076ab08ee0(ajava。lang。ref。ReferenceQueueLock)atjava。lang。ref。ReferenceQueue。remove(ReferenceQueue。java:143)locked0x000000076ab08ee0(ajava。lang。ref。ReferenceQueueLock)atjava。lang。ref。ReferenceQueue。remove(ReferenceQueue。java:164)atjava。lang。ref。FinalizerFinalizerThread。run(Finalizer。java:209)Lockedownablesynchronizers:NoneReferenceHandler2daemonprio10osprio31tid0x00007f8c03000000nid0x2f03inObject。wait()〔0x000070000f7aa000〕java。lang。Thread。State:WAITING(onobjectmonitor)atjava。lang。Object。wait(NativeMethod)waitingon0x000000076ab06b50(ajava。lang。ref。ReferenceLock)atjava。lang。Object。wait(Object。java:502)atjava。lang。ref。Reference。tryHandlePending(Reference。java:191)locked0x000000076ab06b50(ajava。lang。ref。ReferenceLock)atjava。lang。ref。ReferenceReferenceHandler。run(Reference。java:153)Lockedownablesynchronizers:Nonemain1prio5osprio31tid0x00007f8c00802800nid0x1003waitingformonitorentry〔0x000070000ef92000〕java。lang。Thread。State:BLOCKED(onobjectmonitor)atcom。example。optimize。NativeOptimize。main(NativeOptimize。java:41)waitingtolock0x000000076abb62e0(ajava。lang。Object)locked0x000000076abb62d0(ajava。lang。Object)Lockedownablesynchronizers:NoneVMThreadosprio31tid0x00007f8c01008800nid0x2e03runnableGCtaskthread0(ParallelGC)osprio31tid0x00007f8c00803000nid0x2007runnableGCtaskthread1(ParallelGC)osprio31tid0x00007f8c00006800nid0x2403runnableGCtaskthread2(ParallelGC)osprio31tid0x00007f8c01800800nid0x2303runnableGCtaskthread3(ParallelGC)osprio31tid0x00007f8c01801800nid0x2a03runnableGCtaskthread4(ParallelGC)osprio31tid0x00007f8c01802000nid0x5403runnableGCtaskthread5(ParallelGC)osprio31tid0x00007f8c01006800nid0x2d03runnableVMPeriodicTaskThreadosprio31tid0x00007f8c00010800nid0x3803waitingonconditionJNIglobalreferences:6FoundoneJavaleveldeadlock:Thread0:waitingtolockmonitor0x00007f8c000102a8(object0x000000076abb62d0,ajava。lang。Object),whichisheldbymainmain:waitingtolockmonitor0x00007f8c0000ed58(object0x000000076abb62e0,ajava。lang。Object),whichisheldbyThread0Javastackinformationforthethreadslistedabove:Thread0:atcom。example。optimize。NativeOptimize1。run(NativeOptimize。java:25)waitingtolock0x000000076abb62d0(ajava。lang。Object)locked0x000000076abb62e0(ajava。lang。Object)atjava。lang。Thread。run(Thread。java:745)main:atcom。example。optimize。NativeOptimize。main(NativeOptimize。java:41)waitingtolock0x000000076abb62e0(ajava。lang。Object)locked0x000000076abb62d0(ajava。lang。Object)Found1deadlock。
  从上述信息可以看出使用jstack,可以很方便地排查出代码中出现deadlock(死锁)的问题。考点分析
  Java虚拟机的排查工具是一个合格程序员必备的技能,使用它我们可以很方便地定位出问题的所在,尤其在团队合作的今天,每个人各守一摊很容易出现隐藏的bug(缺陷)。因此使用这些排查功能可以帮我们快速地定位并解决问题,所以它也是面试中常问的问题之一。
  和此知识点相关的面试题还有以下这些:除了比较实用的命令行工具之外,有没有方便一点的排查工具?JVM常见的调优手段有哪些?知识扩展可视化排查工具
  JVM除了上面的6个基础命令行工具之外,还有两个重要的视图调试工具,即JConsole和JVisualVM,它们相比于命令行工具使用更方便、操作更简单、结果展现也更直观。
  JConsole和JVisualVM都位于JDK的bin目录下,JConsole(JavaMonitoringandManagementConsole)是最早期的视图调试工具,其启动页面如下图所示:
  可以看出我们可以用它来连接远程的服务器,或者是直接调试本机,这样就可以在不消耗生产环境的性能下,从本机启动JConsole来连接服务器。
  JVisualVM的启动图如下图所示:
  由上图可知,JVisualVM既可以调试本地也可以调试远程服务器。JVM调优
  JVM调优主要是根据实际的硬件配置信息重新设置JVM参数来进行调优的,例如,硬件的内存配置很高,但JVM因为是默认参数,所以最大内存和初始化堆内存很小,这样就不能更好地利用本地的硬件优势了。因此,需要调整这些参数,让JVM在固定的配置下发挥最大的价值。
  JVM常见调优参数包含以下这些:Xmx,设置最大堆内存大小;Xms,设置初始堆内存大小;XX:MaxNewSize,设置新生代的最大内存;XX:MaxTenuringThreshold,设置新生代对象经过一定的次数晋升到老生代;XX:PretrnureSizeThreshold,设置大对象的值,超过这个值的对象会直接进入老生代;XX:NewRatio,设置分代垃圾回收器新生代和老生代内存占比;XX:SurvivorRatio,设置新生代Eden、FormSurvivor、ToSurvivor占比。
  我们要根据自己的业务场景和硬件配置来设置这些值。例如,当我们的业务场景会有很多大的临时对象产生时,因为这些大对象只有很短的生命周期,因此需要把XX:MaxNewSize的值设置的尽量大一些,否则就会造成大量短生命周期的大对象进入老生代,从而很快消耗掉了老生代的内存,这样就会频繁地触发fullgc,从而影响了业务的正常运行。小结
  本课时我们讲了JVM排查的6个基本命令行工具:jps、jstat、jinfo、jmap、jhat、jstack,以及2个视图排查工具:JConsole和JVisualVM;同时还讲了JVM的常见调优参数。

张馨予4000万花园火了,鲜花簇拥瓜果自足,堪比世外桃源说起张馨予,你脑海中的第一印象是什么?是又美又飒乘风破浪的姐姐,还是凭借颜值和性格而圈粉的文艺女青年。结婚之后的张馨予很低调,把更多的时间用在了生活上。她不仅拥有甜蜜的爱情,而且还唏嘘!63岁毕福剑去健身房捞金,舞台表演健腹轮,一口气做十多个01。hr毕福剑,男,1959年1月生,辽宁大连人,现出任优视米网络科技有限公司内容体验官。曾任中国中央电视台文艺部导演。主持的主要节目有星光大道梦想剧场五一七天乐等。因其主持风格今天竟然有两部匹诺曹电影!两位名导掌镜,风格迥异意大利著名童话木偶奇遇记自诞生以来,从不缺少影视改编作品,主人公匹诺曹也成为了一个经典童话形象,烙印在每个人的童年记忆中。最近一部匹诺曹电影,则是2019年意大利本土推出的,由马提王者荣耀英雄打法思路分享宫本武藏篇今天出一期新版宫本武藏的的分享呲牙呲牙这次分享,是我在参考了职业比赛和高端局,结合自己排位使用情况整理出来的1出装推荐开局小打野刀升级二级红色打野刀(或先出铁剑)草鞋陨星抵抗鞋黑切无期迷途说一下夏音的使用心得作者MGA夜魅罗先上图防云满枷锁夏音。技能并没有堆太高。烙印目前带的缚命,单体伤害暖机后尚可,不过也远远达不到t0的程度。手短,大招没有功能性。进入8图后一直在坐冷板凳。根本上不去RNG和EDG粉丝集体破防?LPL知名解说聊季后赛赛程都是魔鬼赛程前言随着TES战队2比0碾压AL战队之后,LPL目前所有季后赛战队名单也是全部出炉,其中有不少观众感慨今年的LPL季后赛含金量拉满,之所以有观众如此评价,也是因为在今年的LPL季后暗黑破坏神不朽法师SOLO入门攻略本文介绍的这套法师build基本上能够在单人SOLO的状态下处理大部分的PVE场景。本套build的优势在于可以帮你高效地完成farm,其次对传奇宝石的依赖度不高(但这并不意味着本MRS签下小将MartinezSa替代SunPayusMRS已经宣布了SunPayus的继任者,前VELOX狙击手MartinezSa加入了摩托车手。MartinezSa与MRS的传言最开始是由外媒Fraglider放出的,如今已成为纵然是深沉的黑夜,也遮不住一丝光亮消失的光芒游戏评测相信看过生化危机釜山行与僵尸世界大战的人都对那席卷一切的致命病毒记忆犹新,还有那恐怖惊悚一望无际的尸海狂潮也一定映像深刻吧?想象一下,万一有一天你成了电影的主角你将如何生存下去,是孙一鸣暗区突围的单局设计思路以驱动为核心丨TGDC20228月14日17日,由腾讯游戏学堂举办的2022腾讯游戏开发者大会(TencentGameDevelopersConference)以线上直播的形式为广大游戏开发者带来行业的最新分享如何养生才是最有效的呢?如何养生才会让自己的身体免疫力增强有一个健康的身体呢?怎么做才算有效养生?今天给大家讲一下一1早餐7002这个时间你的体温已经开始上升,消化功能也已经开始运转,胃肠道处于苏醒状态,
30!本泽马伤退阿扎尔扛起大旗维尼修斯破门皇马夺欧冠开门红西甲豪门皇马上个赛季夺欧冠冠军之路可谓非常艰辛,淘汰赛一路连碰强敌,最后他们还是笑到了最后。新赛季小组赛,皇马签运倒没有那么差了,同组的有莱比锡红牛,顿涅茨克矿工跟凯尔特人,相比巴彭德怀见38军首战不利,欲用贺东生替换梁兴初,林彪急电不可在抗美援朝战争的初期,38军首战遭遇不利,因此彭德怀一度考虑用贺东生替换梁兴初。而国内的林彪得知这一情况后,向彭德怀发出急电万万不可!首战失利在入朝作战之初,彭德怀其实是对第38军小豌豆谈勺子点球被扑门将猜对了我的意图,没能取胜是我的责任直播吧9月6日讯在本轮MLS洛杉矶银河22战平肯萨斯竞技的比赛中,小豌豆埃尔南德斯在补时阶段踢出勺子点球,不料被对手门将识破,错失绝杀。赛后他也在采访中谈到相关话题。这是一场刺激的30岁以后,我明白了10个硬道理,在还输得起的年纪,尽情折腾吧我是用文字温暖你的夕言,点击上方蓝色按键关注我哦。20岁的时候,我无法想象自己30岁是什么样,但真的到了30岁,我又觉得自己和20岁没有区别。我依然鸡血,依然充满热情,依然喜欢折腾清荷札记浅喜深爱,最深懂得作者清荷札记浅喜深爱,最深懂得,半亩荷田,随喜念安,莲开柔情,灵魂静驻,素心相交,无言也暖!八月浅秋,阳光暖着,盛满了青藤的微光与温暖,日子不宠不惊,一切都是清欢的模样。如同在一页抒情文案(精选77句)抒情文案1自恃仅似,墨魂,未流连不念勿倾心,木兰香亦可拂悲吟,夜未眠,相思引,只为谁?箜篓丝蛛何谓犹忧,苦情人,何必执杵。2群星闪烁,上弦月弯弯的嵌在星空里,枣林里流动着一阵阵清香今天才知道,原来剥板栗这么简单,3分钟一大盘,学会了受益终身三餐美味,四季幸福,大家好!又到了吃板栗的季节了,但是生板栗的外壳处理起来却不容易。今天,我来给大家教一个处理板栗的小绝招,用我的这个方法,板栗皮轻易就能脱落,再也不用因为处理板栗入秋后,遇到这菜我从不手软,一次买20斤,晒干鲜美翻倍,特省事导语立秋后,茄子豆角靠边站,这菜抓紧吃,晒干囤起来,美味翻倍,炒菜炖肉都好吃,错过了真可惜。大家好,我是傻姐美食,生活中唯有美食和美景不可辜负。秋天到了,是蔬菜大丰收的季节,往年的今日八月初八ampampquot大吉日ampampquot!顺应老传统,别忘记吃这8宝,添财添吉祥头条创作挑战赛没了烟火气,人生就是一段孤独的旅程。今日八月初八大吉日!顺应老传统,别忘记吃这8宝,添财添吉祥,快快收藏吧!第一宝饺子推荐食谱翡翠白菜饺子白菜意为百财,来一盘白菜形饺电饭煲版蜜汁叉烧肉,色泽红润肥而不腻,真的很下饭家里的米饭又遭殃了,真的太好吃了!懒人食谱!电饭煲版蜜汁叉烧肉真的很下饭!每片叉烧肉都裹满了灵魂酱汁,色泽红润肥而不腻,不吃了两碗饭都对不起自己。今天就来分享下蜜汁叉烧肉做法,真的忆往千辛万苦大串联之二火车上的日日夜夜从我们踏上串联之路开始,全国的火车就没有了运行时刻,或者是有运行时刻却不能实现,给我的感觉就是,火车想走就走,想停就停,想停多久就停多久。所以我们除了有一个大概齐的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网