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

最全JVM内存调优详解

  一、前提
  JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。同时,在进行性能调优前,您需要理解并掌握以下的相关基础理论知识:
  1、JVM垃圾收集器和垃圾回收算法
  2、JVM性能监控常用工具和命令
  3、JVM运行时数据区域
  4、能够读懂gc日志
  5、内存分配与回收策略二、JVM内存结构
  从上图可以看出,整个JVM内存是由栈内存、堆内存和永久代构成。
  年轻代(Newgeneration)edens0s1
  堆内存年轻代老年代(Oldgeneration)
  JDK1。8以前:JVM内存栈内存堆内存永久代
  JDK1。8以后:由元空间取代了永久代,元空间并不在JVM中,而是使用本地内存。因此JVM内存栈内存堆内存1、栈内存
  栈内存归属于单个线程,也就是每创建一个线程都会分配一块栈内存,而栈中存储的东西只有本线程可见,属于线程私有。
  栈的生命周期与线程一致,一旦线程结束,栈内存也就被回收。
  栈中存放的内容主要包括:8大基本类型对象的引用实例的方法
  2、堆内存
  堆内存是由年轻代和老年代构成,JDK1。8以后,永久代被元空间取代,使用直接内存,不占用堆内存。堆内存是Jvm中空间最大的区域,所有线程共享堆,所有的数组以及内存对象的实例都在此区域分配。我们常说的垃圾回收就是作用于堆内存。
  Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:13、永久代(元空间)
  这个区域是常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些环境。这个区域不存在垃圾回收!关闭虚拟机就会释放这个区域的内存。
  当发现系统中元空间占用内存比较大时,排查方向是否加载了大量的第三方jar包,Tomcat部署了太多应用,大量动态生成的反射类等。三、JVM常用参数
  首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB3GB(一般来说Windows系统下为1。5G2G,Linux系统下为2G3G),而64bit以上的处理器就不会有限制。1、堆大小设置
  javaserverXmx4gXms4gXmn2gXss128k
  Xmx4g:设置JVM最大可用内存为4g。
  Xms4g:设置JVM最小可用内存为4g。一般配置为与Xmx相同,避免每次垃圾回收完成后JVM重新分配内存。
  Xmn2g:设置年轻代大小为2G。整个堆大小年轻代大小年老代大小,所以增大年轻代后,将会减小年老代大小。
  Xss128k:设置每个线程的堆栈大小。JDK5。0以后每个线程默认大小为1M,以前每个线程大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。
  javaserverXmx4gXms4gXmn2gXss128kXX:NewRatio4XX:SurvivorRatio4XX:MaxMetaspaceSize16mXX:MaxTenuringThreshold0
  XX:NewRatio4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的15
  XX:SurvivorRatio4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的16
  XX:MaxMetaspaceSize16m:设置元空间最大可分配大小为16m。
  XX:MaxTenuringThreshold0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。2、垃圾回收器选择
  JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5。0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5。0以后,JVM会根据当前系统配置进行判断。2。1吞吐量优先的并行收集器
  javaserverXmx4gXms4gXmn2gXss128kXX:UseParallelGCXX:ParallelGCThreads20XX:UseParallelOldGCXX:UseAdaptiveSizePolicy
  XX:UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
  XX:ParallelGCThreads20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
  XX:UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6。0支持对年老代并行收集。
  XX:UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。2。2响应时间优先的并发收集器
  javaserverXmx4gXms4gXmn2gXss128kXX:ParallelGCThreads20XX:UseConcMarkSweepGCXX:UseParNewGCXX:CMSFullGCsBeforeCompaction5XX:UseCMSCompactAtFullCollection
  XX:UseConcMarkSweepGC:设置年老代为并发收集
  XX:UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用
  XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生碎片,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
  XX:UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片3、其他辅助配置
  GC日志打印
  XX:PrintGC:输出形式:〔GC118250K113543K(130112K),0。0094143secs〕〔FullGC121376K10414K(130112K),0。0650971secs〕
  XX:PrintGCDetails:输出形式:〔GC〔DefNew:8614K781K(9088K),0。0123035secs〕118250K113543K(130112K),0。0124633secs〕〔GC〔DefNew:8614K8614K(9088K),0。0000665secs〕〔Tenured:112761K10414K(121024K),0。0433488secs〕121376K10414K(130112K),0。0436268secs〕
  OOM生成dump文件
  XX:HeapDumpOnOutOfMemoryError表示jvm发生oom异常时,自动生成dump文件
  XX:HeapDumpPath表示生成dump文件的存放目录四、内存溢出排查
  一般来说内存溢出主要分为以下几类:
  堆溢出(java。lang。OutOfMemoryError:Javaheapspace)
  栈深度不够(java。lang。StackOverflowError)
  栈线程数不够(java。lang。OutOfMemoryError:unabletocreatenewnativethread)
  元空间溢出(java。lang。OutOfMemoryError:Metaspace)1、元空间溢出(java。lang。OutOfMemoryError:Metaspace)
  Metaspace元空间主要是存储类的元数据信息,各种类描述信息,比如类名、属性、方法、访问限制等,按照一定的结构存储在Metaspace里。
  一般来说,元空间大小是固定不变的。在出现溢出后,首先通过命令或监控工具(如下图)查看元空间大小,再检查是否XX:MaxMetaspaceSize配置太小导致。
  如果发现元空间大小是持续上涨的,则需要检查代码是否存在大量的反射类加载、动态代理生成的类加载等导致。可以通过XX:TraceClassLoadingXX:TraceClassUnloading记录下类的加载和卸载情况,反推具体问题代码。
  2、栈深度不够(java。lang。StackOverflowError)
  引发StackOverFlowError的常见原因有:无限循环递归调用同一时间执行大量方法,资源耗尽方法中声明大量局部变量其它消耗栈资源的方法xss配置太小导致VMArgs:Xss128kpublicclassJavaStackSOF{privateintstackLength1;publicvoidstackLeak(){stackLength;stackLeak();}publicstaticvoidmain(String〔〕args){JavaStackSOFoomnewJavaStackSOF();try{oom。stackLeak();}catch(Throwablee){System。out。println(stacklength:oom。stackLength);throwe;}}}stacklength:2101Exceptioninthreadmainjava。lang。StackOverflowErroratcom。sandy。jvm。chapter02。JavaStackSOF。stackLeak(JavaStackSOF。java:13)atcom。sandy。jvm。chapter02。JavaStackSOF。stackLeak(JavaStackSOF。java:14)atcom。sandy。jvm。chapter02。JavaStackSOF。stackLeak(JavaStackSOF。java:14)3、栈线程数不够(java。lang。OutOfMemoryError:unabletocreatenewnativethread)
  这类错误目前在生成系统只遇到过一次,原因是:linux系统中非root用户默认创建线程数最多是1024。解决办法是修改文件:etcsecuritylimits。d90nproc。conf
  还有一种情况是xss配置太大,那么操作系统可创建的最大线程数太小导致,一般除非误操作是不会出现此问题的。4、堆溢出(java。lang。OutOfMemoryError:Javaheapspace)
  堆溢出是常见也是最复杂的一种情况。导致堆溢出可能的情况有:堆内存配置太小超出预期的访问量:访问量飙升超出预期的数据量:系统中是否存在一次性提取大量数据到内存的代码内存泄漏
  解决思路一般是:
  一、堆dump文件获取
  1、通过参数配置自动获取dump文件(推荐)
  2、jmapdump:formatb,filefilename。hprofpid
  二、MAT工具分析
  1、分析大对象、堆中存储信息、可能存在的内存泄漏地方,便于定位问题位置五、JVM监控
  常用的监控工具或命令有:jstack、jstat、jConsole、jvisualvm。监控指标主要是各内存区域大小是否合理、fullGC频率及耗时、youngGC耗时、线程数等。1、jstack
  jstack主要用于打印线程堆栈信息,帮助问题的定位。一般配合topHpPID使用。
  通过top命令发现某个java服务占用1234的CPU,如图:
  通过topHpPID命令可以看到占用CPU比较高的线程,如图:
  再次通过jstackPIDlog。txt,输出堆栈信息即可进行排查定位。2、jstat
  jstat命令是分析JVM运行状况的常用命令。
  jstatoptions
  class用于查看类加载情况的统计
  compiler用于查看HotSpot中即时编译器编译情况的统计
  gc用于查看JVM中堆的垃圾收集情况的统计
  gccapacity用于查看新生代、老生代及持久代的存储容量情况
  gcmetacapacity显示metaspace的大小
  gcnew用于查看新生代垃圾收集的情况
  gcnewcapacity用于查看新生代存储容量的情况
  gcold用于查看老生代及持久代垃圾收集的情况
  gcoldcapacity用于查看老生代的容量
  gcutil显示垃圾收集信息
  gccause显示垃圾回收的相关信息(通gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
  printcompilation输出JIT编译的方法信息
  以jstatgcutil为例:〔roothadoop〕jstatgcutil3346显示垃圾收集信息S0S1EOMCCSYGCYGCTFGCFGCTGCT52。970。0042。1013。9297。3998。0280。02000。0000。020S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比E:年轻代中Eden(伊甸园)已使用的占当前容量百分比O:old代已使用的占当前容量百分比M:元数据区已使用的占当前容量百分比CCS:压缩类空间已使用的占当前容量百分比YGC:从应用程序启动到采样时年轻代中gc次数YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)FGC:从应用程序启动到采样时old代(全gc)gc次数FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)GCT:从应用程序启动到采样时gc用的总时间(s)3、jConsole
  JConsole是基于JMX的可视化监视、管理工具。可以很方便的监视本地及远程服务器的java进程的内存使用情况。3。1被监控的程序运行时给虚拟机添加一些运行的参数
  无需认证的远程监控配置
  Dcom。sun。management。jmxremote。port60001监控的端口号
  Dcom。sun。management。jmxremote。authenticatefalse关闭认证
  Dcom。sun。management。jmxremote。sslfalse
  Djava。rmi。server。hostname192。168。1。23。2客户端连接被监控程序
  找到JDK安装路径,打开bin文件夹,双击jconsole。exe,在已经打开的JConsole界面操作连接新建连接选择远程进程输入远程主机IP和端口号点击连接
  4、jvisualvm
  jvisualvm与jConsole连接方式一致,连接后界面如下:

光速真的无法超越吗?其实它的速度远超光速,人类却永远无法掌握物理学是万物的基础,人类的诞生甚至是宇宙的诞生,都只能从物理上来解释,今天我们就来探讨一下,宇宙中的第一速度光速,光速不仅仅代表着光的速度,在它的背后隐藏着太多的奥秘,以至于科……三星一款内置APP致上万款应用被集体降速,微软等巨头也被牵连雷峰网消息,3月4日,韩国推特用户GaryeonHan发文称,三星GalaxyS22发明了一款名为GOS(全称GameOptimizingService,游戏优化服务)的应用程……诺维斯基批评哈登和西蒙斯球员还能逼球队交易自己,这太新鲜了时代变了,NBA也改变了许多,在许多年前,没有那么多三分,没有那么多犯规,大家在赛场上也不会和睦相处,明星球员更多时候也都各自为战,很少会见到联盟里最好的球员会聚到一起追逐冠军……5565岁是承上启下的长寿关键期,这10年请做好5件事常说五十而知天命。这句话透露着中年的沉淀和阅历,但也透露一些无奈。不得不说,人在五十岁后确实是处于身体的过渡阶段,很可能影响着自身的长寿问题!55岁65岁是承上启下……智慧养猪系统平台功能需求养猪场物联网解决方案如今养猪已经成为有头有脸的公司争相投资的领域,传感技术、无线通信技术、人工智能技术、云计算、大数据、物联网技术应用在养殖业,可以实现科学养殖,降本增效、精准养殖。【了解陕西亿鑫……中国队缺席花滑世锦赛惹争议!究竟是主动放弃,还是忘记报名中国队缺席花滑世锦赛惹争议!究竟是主动放弃,还是忘记报名。2022年花样滑冰世锦赛将于本月21日在法国开赛,目前国际滑联已经公布了参赛运动员的名单,令人意外的是参赛名单中没有中……华为nova10开启预售,nova9沦为百元机,花粉悲伤不已华为自营旗舰店曝光显示,华为nova10标准版采用中置挖孔直屏,背面有3个摄像头,提供4种颜色。该机除了高大上的设计,其轻薄也是一大看点。博主DigitalChatSta……11座乌克兰极具历史魅力的建筑设计下面我们一起来欣赏一下,关于乌克兰的11座极具历史魅力的建筑设计大盘点!以下的排名不分先后的顺序。01圣索菲亚大教堂SaintSophiaCathedral圣索菲亚……良心企业,白象三分之一职工是残疾人央视315晚会曝光的土坑酸菜受影响最大的当属方便面企业,康师傅、统一两大巨头被卷入其中,不仅品牌形象受损,股价更是大幅下跌。统一的老坛酸菜牛肉面。康师傅的老坛酸菜牛……中国天眼FAST重大发现确认超高能快速射电暴起源关键证据2007年时,西弗吉尼亚大学的天体物理学家邓肯洛里默(DuncanLorimer)给他的学生大卫纳克维克(DavidNarkevic)分配了一个任务,遍历澳大利亚帕克斯射电望远……春眠不觉晓,处处闻啼鸟春眠不觉晓处处闻啼鸟春分节气话养生春分是农历二十四节气中的第4个节气;也是春季中的第4个节气,时间点在每年公历3月2022日之间,是春季90天的中分点,表示昼……粉底液才涂2小时不到,脸上就暗沉发黄?看看你是否忽略了这3点现在化妆已经是见怪不怪的事情了,而且妆容造型是一个人最先展示在外界的特征,有趣的灵魂很重要,但是在这之前,灵秀干净的外貌作为第一印象是让人开始愿意接近的第一步,因此化妆也好,不……
詹姆斯的前队友令人唏嘘!从NBA球员到流浪汉,曾在街头遭人暴詹姆斯前骑士队队友德隆蒂韦斯特再次流浪街头乞讨!德隆蒂韦斯特在还是NBA运动员的时候,曾经也是一位千万富翁,但现在却一败涂地将资产全部败光,他曾在街上被人殴打,后来又被独……俄罗斯行游影记(51)莫斯科金环之苏兹达里(一)离开弗拉基米尔市区,我们前往离弗拉基米尔市区不远的苏兹达里。虽然是在车行途中,我也没有放下手中的相机,一路车拍不止,记录下这段路途中的景象。旅行在外,一切都是新鲜的……26岁演少女出名,31岁演大学生被认可,谭松韵的少女感为何这在《我就是演员3》中章子怡批评盛一伦说:不合适自己的戏为什么要接呢?于是,她在电视剧《上阳赋》中饰演15岁的花季少女;郝蕾吐槽演艺圈大龄女演员出演少女的现状:……历史上熊市大跌之后,哪类股抗跌,哪类股最容易反弹?1、历史数据看,熊市里,比较抗跌的是银行。2、历史数据看,由熊向牛转换,反弹比较强势的是食品饮料。3、历史数据看,向下击穿2900点,6个月内基本还是负的。所以,不……为啥波罗的海三国与俄罗斯结冤那么深?带你走进之一的爱沙尼亚有八百多年历史的塔林老城是世遗景点,也是波罗的海三国中保存最为完好的中世纪老城。从拉脱维亚首都里加坐大巴到爱沙尼亚首都塔林,车程二小时半左右,在塔林定的青旅距汽车总站约一……各行星注意!中国力量将斗转星移探索浩瀚宇宙,发展航天事业,建设航天强国,是我们不懈追求的航天梦。在中国航天日(4月24日)这天,国家航天局副局长吴艳华的一段采访火了。国家航天局副局长吴艳华在接受……目前可以闭眼买的4款手机,几乎零差评,覆盖低中高三档目前可以闭眼买的4款手机,几乎零差评,覆盖低、中、高三档,一起来看一下吧第一款:红米Note10Pro千元5G旗舰,各方面配置在同价格段比较强悍且均衡,且性价比不错,搭载……做手擀面时,加水还是加油?教你正确做法,口感爽滑,筋道又美味面粉能制成的面食有很多,常见的有水饺、包子、馒头、大饼和面条,随便拿出来一样,都能当成主食,而且花样还繁多,就拿面条来讲,就不低于十几种,刀削面、拉面、臊子面、烩面还有炒面,都……日常哪些行为会伤肝?除了熬夜,这2样也得好好改重视肝脏保养的人会从生活中多细节入手,积极保护肝脏细胞,增强其功能,而在肝脏健康的前提下代谢保持顺利、消化正常、蛋白质合成也顺利。但如果错误生活方式养成让肝脏细胞变性,坏……当你迷茫时,不如看看导师马克思的话马克思是马克思主义的创始人之一,第一国际的组织者和领导者,马克思主义政党的缔造者之一,全世界无产阶级和劳动人民的革命导师,无产阶级的精神领袖,国际共产主义运动的开创者。也是伟人……马西克34分大爆发,大胡子低迷饮恨迈阿密!02费城已到悬崖边北京时间5月5日上午,NBA季后赛东部半决赛,热火迎战76人,在第一回合的较量中大胡子独木难支,已输一局,暂时落后!硬汉巴特勒本场比赛,恩比德继续缺席,内线被热火打……CBA四消息!林书豪已经到国内,中国男篮输给大学生球队8月13日,为了大家能够了解更多CBA联赛和中国篮球的消息,笔者汇总了一些最新消息,来与广大的球迷一起分享一下。1、中国男篮输给阿拉巴马大学男篮在今天上午,中国男篮……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网