应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

生产环境如何排除和优化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的常见调优参数。

过年回家被人说孩子牙齿长丑了要箍?华西口腔专家教你辨别华西口腔的医生,都说你们的口腔厉害,看看为什么我的孩子刚换了牙齿感觉变丑了?一收假就去看牙科的,是不是在假期里被热心肠的亲友们反复提醒了娃儿牙齿好丑?哈哈。。。。。。过年……美国NBA球星都开哪些豪车,买豪车跟我们买玩具车一样NBA球星很有钱,他们如何炫富?NBA豪车库现在的年轻人喜欢看NBA。NBA的学名也称为美国篮球协会。它是一个国际体育和媒体集团。它是世界上最高水平的篮球联赛。既然……莫雷高德,是真正的黑马吗?决赛会威胁到樊振东吗?有朋友问:那个年轻小伙很厉害,打到男单决赛了,他应该是休斯顿世乒赛最大的黑马,对吧?我说:是,也不是。说是的原因,一目了然;莫雷高德以世界第77的排名,打进了男单决……真是太巧了!国乒两个大满贯都是001号火炬手,女排一姐二姐也2月4日,北京冬奥会开幕了,来自世界各地的冰雪爱好者,齐聚北京,共享奥林匹克美好时刻。如此体育盛会,在火炬传递阶段,国乒女排两大威武之师的选手代表,参与了火炬传递,在国乒……木兰花乡里的诗意追寻去年我来木兰花乡,于紫色花海前留影。这些年我爱外出旅游,但总有喜新厌旧的毛病,通常在一家景点走马观花了一次后,是没有兴趣再去游第二回的。除了云南的丽江古城风景让我流连忘返……联想发布新款YogaSlim7iCarbon笔记本2。5K9本文转自:IT之家作者:孤城联想今日海外发布新款YogaSlim7iCarbon笔记本,搭载2。5K90Hz屏,配置升级到13代酷睿,轻至0。97kg。IT之家了解……非洲一部落自称是中国人,希望能回国,专家的确是中国人的后裔中华上下五千多年的历史,数千年的历史沉淀下来了优秀的中华传统文化,它不仅影响着生活在中华大地上的人们,而且对周边民族和国家也产生了深远的影响。中华文化之所以能够经久不衰,且愈发……大S汪小菲已离婚,将官宣?被困在假豪门的大S,还是输了?01hr2011年,在相识不到20天后,30岁的汪小菲和35岁的大S,在三亚举行了盛大婚礼。伴随着这场婚礼的,还有汪小菲与张朝阳的决裂,和传言中的耳光门。汪小菲方要……女性贫血吃什么补血?贫血,是我们日常生活中很常见的一种病症,在我们身边也非常常见,尤其是女性朋友以及小孩子,都是贫血的主要发病群体。说到贫血,补血是必要的。贫血指的的是人体的红细胞量减少,从……男人过了60岁,如果还能够做好这些事情,一般都会更长寿前言:60岁对男人来说已经在中年的时候,有些人觉得已经进入老年,但是有些人觉得还是比较年轻的。在这个世界上很多时候很多事情,我们想得很简单,当去做的时候才发现真的很复杂,……诸葛亮四兄弟的血脉延续影视形象今天再谈诸葛家族的那些事儿。扩个容,谈哥四个,即诸葛瑾、诸葛亮、诸葛均、诸葛诞。其中诸葛瑾、诸葛亮、诸葛均是同父同母的亲兄弟,母亲章氏,父亲诸葛珪为汉末兖州……双人成行开发商被迫放弃游戏名所有权因与TakeTwo部分重合据外媒Eurogamer报道,由于《双人成行ItTakesTwo》的英文标题和R星母公司TakeTwo部分重合,且后者拥有TakeTwo的名称商标。因此《双人成行》开发商Haz……
被骂10年后,42岁董洁翻红!看了她直播和4千W豪宅,冷清秋这年头,翻红的明星不少,有靠口碑和演技的,有靠综艺和比赛的。但因直播带货复火,还没有被全网群嘲的,却不多。今年42岁的董洁,就因为两场直播意外翻红了。甚至,在……华硕发布TUFGaming和Prime系列的AMDA620主AMD发布了A620芯片组,华硕也随之推出其TUFGaming和Prime的A620主板,定位在B650之下,不过也是给用户提供多一种主板选择。近日华硕宣布推出用于AMD……高中生几点睡算熬夜,能补回来吗?需要吃什么?高中生的作息时间因人而异,但通常应该保证每天8小时左右的睡眠时间。如果在熬夜,即晚上11点以后入睡,这就算是熬夜了。熬夜会影响人体的生物钟和代谢,影响身体的健康,长期下去会对身……玛莲妮亚快解脱了!老头环宣布DLC后,壶头哥找到了新目标《艾尔登法环》的发售距今已经过去整整一年,在这段日子里不断有玩家去挑战速通,亦或是用各种非常规的游戏设备通关。可要说谁给大伙留下的印象最深刻,非壶头哥莫属。壶头哥的游戏名……和邦系谋划再添新丁时刻,15年老将被带走协助调查华夏时报(www。chinatimes。net。cn)记者张玫陈锋北京报道2月20日晚间,和邦生物接连发布三份重磅公告,分别涉及年报净利润同比增长26。12,董秘被带走协……港澳游说走就走!行李里除了身份证连花清瘟外,还要带上这些随着疫情形势的逐渐平稳,2月初内地与港澳也实现了全面通关。一时之间,赴港澳旅游的相关搜索登上热榜。而根据携程网公开的数据来看,香港通关后的首场旅游直播当日成交总额突破3000万……站起来了!中国首次对美国芯片巨头出手!中美半导体之战,进入关键反击期。近日,中国网信办发布的一条消息,给动荡不安的全球半导体产业圈,再添一记重锤。网信办表示,为保障关键信息基础设施供应链安全,防范产品问……为什么越来越多的人不买华为手机了?4点原因道出真相!华为作为国产手机品牌的老大哥,过去的十年里可以说是高速发展,依靠自研芯片和各种黑科技加持,用户体量与日俱增;可是最近两年,越来越多的老用户表示不会再买华为手机了,其实原因无非就……我是为你燃烧的香春风悠扬又是一年绿草伴枯黄你把生命化为一堆灰烬我把火纸燃成祭拜的红光我期盼春日如果你化作一朵春花我就是你飘逸的芬芳我回眸大地如果……锂电行业机遇全在这里!盘点未来10大最具潜力的锂电池新材料!2022年,我国锂离子电池产量达750GWh,同比增长超过130,行业总产值突破1。2万亿元。工信部有关负责人表示,2022年,锂电在新能源汽车领域以及风光储能、通信储能、家用……ins美女推荐你的一生我只借一程,这一程便是余生今天介绍的是Zianra,ins上ID为zialaevna。k,目前28万粉。遇到任何事,笑总比哭更能解决问题只要对象换得快,没有悲伤只有爱尝尽人间百味的人生……全明星星锐赛来了,二年级将成为黄雀?粉丝这次仍是拳怕少壮CBA星锐赛来了,但二年级想成为黄雀,一年级:真当我们是鱼腩CBA全明星星锐赛即将到来,这次一年级的菜鸟将向着二年级的师兄们发起正式挑战。虽然从比赛经验以及球技等方面来说……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网