成都网站建设市场,湛江免费网站制作,嵌入式培训学费,前端培训费用大概多少文章目录#xff08;持续更新中... ...#xff09;GC分析内存调优工具篇JDK自带的工具jconsolejvisualvm第三方工具arthas#xff08;重要#xff09;jprofiler#xff08;收费的#xff09;MAT、GChisto、gcviewer、GC Easy#xff08;待完善#xff09;参数、命…
文章目录持续更新中... ...GC分析内存调优工具篇JDK自带的工具jconsolejvisualvm第三方工具arthas重要jprofiler收费的MAT、GChisto、gcviewer、GC Easy待完善参数、命令常见垃圾回收器组合参数设定(1.8)GC常用参数Parallel常用参数CMS常用参数G1常用参数调优案例案例1-微笑大佬的案例案例2-马士兵的案例调优前的基础概念什么是调优调优从规划开始优化环境解决JVM运行中的问题一个案例理解常用工具jconsole远程连接jvisualvm远程连接arthas在线排查工具案例汇总问答参考链接持续更新中… …
GC分析内存调优
工具篇
JDK自带的工具
jconsole
jvisualvm
第三方工具
arthas重要
jprofiler收费的
MAT、GChisto、gcviewer、GC Easy待完善
参数、命令
1、JVM的命令行参数参考https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 2、HotSpot参数分类 标准 - 开头所有的HotSpot都支持 非标准-X 开头特定版本HotSpot支持特定命令 不稳定-XX 开头下个版本可能取消
试验用程序
import java.util.List;
import java.util.LinkedList;public class HelloGC {public static void main(String[] args) {System.out.println(HelloGC!);List list new LinkedList();for(;;) {byte[] b new byte[1024*1024];list.add(b);}}
}区分概念内存泄漏memory leak内存溢出out of memory java -XX:PrintCommandLineFlags HelloGC java -Xmn10M -Xms40M -Xmx60M -XX:PrintCommandLineFlags -XX:PrintGC HelloGCPrintGCDetails PrintGCTimeStamps PrintGCCauses java -XX:UseConcMarkSweepGC -XX:PrintCommandLineFlags HelloGC java -XX:PrintFlagsInitial 默认参数值 java -XX:PrintFlagsFinal 最终参数值 java -XX:PrintFlagsFinal | grep xxx 找到对应的参数 java -XX:PrintFlagsFinal -version |grep GC
常见垃圾回收器组合参数设定(1.8) -XX:UseSerialGC Serial New (DefNew) Serial Old 小型程序。默认情况下不会是这种选项HotSpot会根据计算及配置和JDK版本自动选择收集器 -XX:UseParNewGC ParNew SerialOld 这个组合已经很少用在某些版本中已经废弃 https://stackoverflow.com/questions/34962257/why-remove-support-for-parnewserialold-anddefnewcms-in-the-future -XX:UseConc(urrent)MarkSweepGC ParNew CMS Serial Old -XX:UseParallelGC Parallel Scavenge Parallel Old (1.8默认) 【PS SerialOld】 -XX:UseParallelOldGC Parallel Scavenge Parallel Old -XX:UseG1GC G1 Linux中没找到默认GC的查看方法而windows中会打印UseParallelGC java XX:PrintCommandLineFlags -version通过GC的日志来分辨 Linux下1.8版本默认的垃圾回收器到底是什么 1.8.0_181 默认看不出来Copy MarkCompact1.8.0_222 默认 PS PO
GC常用参数
-Xmn -Xms -Xmx -Xss年轻代 最小堆 最大堆 栈空间 -XX:UseTLAB使用TLAB默认打开 -XX:PrintTLAB打印TLAB的使用情况 -XX:TLABSize设置TLAB大小 -XX:DisableExplictGCSystem.gc()不管用 FGC -XX:PrintGC -XX:PrintGCDetails -XX:PrintHeapAtGC -XX:PrintGCTimeStamps -XX:PrintGCApplicationConcurrentTime (低)打印应用程序时间 -XX:PrintGCApplicationStoppedTime 低打印暂停时长 -XX:PrintReferenceGC 重要性低记录回收了多少种不同引用类型的引用 -verbose:class类加载详细过程 -XX:PrintVMOptions -XX:PrintFlagsFinal -XX:PrintFlagsInitial必须会用 -Xloggc:opt/log/gc.log -XX:MaxTenuringThreshold升代年龄最大值15 锁自旋次数 -XX:PreBlockSpin 热点代码检测参数-XX:CompileThreshold 逃逸分析 标量替换 … 这些不建议设置
Parallel常用参数
-XX:SurvivorRatio -XX:PreTenureSizeThreshold大对象到底多大 -XX:MaxTenuringThreshold -XX:ParallelGCThreads并行收集器的线程数同样适用于CMS一般设为和CPU核数相同 -XX:UseAdaptiveSizePolicy自动选择各区大小比例
CMS常用参数
-XX:UseConcMarkSweepGC -XX:ParallelCMSThreadsCMS线程数量 -XX:CMSInitiatingOccupancyFraction使用多少比例的老年代后开始CMS收集默认是68%(近似值)如果频繁发生SerialOld卡顿应该调小频繁CMS回收 -XX:UseCMSCompactAtFullCollection在FGC时进行压缩 -XX:CMSFullGCsBeforeCompaction多少次FGC之后进行压缩 -XX:CMSClassUnloadingEnabled -XX:CMSInitiatingPermOccupancyFraction达到什么比例时进行Perm回收 GCTimeRatio设置GC时间占用程序运行时间的百分比 -XX:MaxGCPauseMillis停顿时间是一个建议时间GC会尝试用各种手段达到这个时间比如减小年轻代
G1常用参数
-XX:UseG1GC -XX:MaxGCPauseMillis建议值G1会尝试调整Young区的块数来达到这个值 -XX:GCPauseIntervalMillisGC的间隔时间 -XX:G1HeapRegionSize分区大小建议逐渐增大该值1 2 4 8 16 32。随着size增加垃圾的存活时间更长GC间隔更长但每次GC的时间也会更长ZGC做了改进动态区块大小 G1NewSizePercent新生代最小比例默认为5% G1MaxNewSizePercent新生代最大比例默认为60% GCTimeRatioGC时间建议比例G1会根据这个值调整堆空间 ConcGCThreads线程数量 InitiatingHeapOccupancyPercent启动G1的堆空间占用比例
调优案例
案例1-微笑大佬的案例
http://www.ityouknow.com/jvm/2017/09/19/GC-tuning.html
案例2-马士兵的案例
调优前的基础概念
吞吐量用户代码时间 /用户代码执行时间 垃圾回收时间响应时间STW越短响应时间越好 所谓调优首先确定追求啥吞吐量优先还是响应时间优先还是在满足一定的响应时间的情况下要求达到多大的吞吐量… 问题科学计算吞吐量。数据挖掘thrput。吞吐量优先的一般PS PO。响应时间网站 GUI API 1.8 G1
什么是调优
根据需求进行JVM规划和预调优优化运行JVM运行环境慢卡顿解决JVM运行过程中出现的各种问题(OOM)
调优从规划开始
调优从业务场景开始没有业务场景的调优都是耍流氓。 无监控压力测试能看到结果不调优。 步骤 1、熟悉业务场景没有最好的垃圾回收器只有最合适的垃圾回收器 1.1、响应时间、停顿时间 [CMS G1 ZGC] 需要给用户作响应 1.2、吞吐量 用户时间 /( 用户时间 GC时间) [PS] 2、选择回收器组合。3、计算内存需求经验值 1.5G 16G。4、选定CPU越高越好5、设定年代大小、升级年龄。6、设定日志参数。6.1 -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:UseGCLogFileRotation -XX:NumberOfGCLogFiles5 -XX:GCLogFileSize20M -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintGCCause。6.2或者每天产生一个日志文件 7、观察日志情况。 案例1 垂直电商最高每日百万订单处理订单系统需要什么样的服务器配置 这个问题比较业余因为很多不同的服务器配置都能支撑(1.5G 16G)1小时360000集中时间段 100个订单/秒找一小时内的高峰期1000订单/秒经验值非要计算一个订单产生需要多少内存512K * 1000 500M内存专业一点儿问法要求响应时间100ms压测 案例2 12306遭遇春节大规模抢票应该如何支撑12306应该是中国并发量最大的秒杀网站号称并发量100W最高CDN - LVS - NGINX - 业务系统 - 每台机器1W并发10K问题 100台机器普通电商订单 - 下单 -订单系统IO减库存 -等待用户付款12306的一种可能的模型 下单 - 减库存 和 订单(redis kafka) 同时异步进行 -等付款减库存最后还会把压力压到一台服务器可以做分布式本地库存 单独服务器做库存均衡大流量的处理方法分而治之 案例3 怎么得到一个事务会消耗多少内存 弄台机器看能承受多少TPS是不是达到目标扩容或调优让它达到。 用压测来确定。 优化环境
有一个50万PV的资料类网站从磁盘提取文档到内存原服务器32位1.5G的堆用户反馈网站比较缓慢因此公司决定升级新的服务器为64位16G的堆内存结果用户反馈卡顿十分严重反而比以前效率更低了 a. 为什么原网站慢?很多用户浏览数据很多数据load到内存内存不足频繁GCSTW长响应时间变慢 b. 为什么会更卡顿内存越大FGC时间越长 c. 咋办PS - PN CMS 或者 G1系统CPU经常100%如何调优(面试高频)CPU100%那么一定有线程在占用系统资源 a. 找出哪个进程cpu高top b. 该进程中的哪个线程cpu高top -Hp c. 导出该线程的堆栈 (jstack) d. 查找哪个方法栈帧消耗时间 (jstack) e. 工作线程占比高 | 垃圾回收线程占比高系统内存飙高如何查找问题面试高频 a. 导出堆内存 (jmap) b. 分析 (jhat jvisualvm mat jprofiler … )如何监控JVM a. jstat jvisualvm jprofiler arthas top…
解决JVM运行中的问题
一个案例理解常用工具
测试代码
package com.aiz.jvm.gc;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 从数据库中读取信用数据套用模型并把结果进行记录和传输*/public class T15_FullGC_Problem01 {private static class CardInfo {BigDecimal price new BigDecimal(0.0);String name 张三;int age 5;Date birthdate new Date();public void m() {}}private static ScheduledThreadPoolExecutor executor new ScheduledThreadPoolExecutor(50,new ThreadPoolExecutor.DiscardOldestPolicy());public static void main(String[] args) throws Exception {executor.setMaximumPoolSize(50);for (;;){modelFit();Thread.sleep(100);}}private static void modelFit(){ListCardInfo taskList getAllCardInfo();taskList.forEach(info - {// do somethingexecutor.scheduleWithFixedDelay(() - {//do sth with infoinfo.m();}, 2, 3, TimeUnit.SECONDS);});}private static ListCardInfo getAllCardInfo(){ListCardInfo taskList new ArrayList();for (int i 0; i 100; i) {CardInfo ci new CardInfo();taskList.add(ci);}return taskList;}
}java -Xms200M -Xmx200M -XX:PrintGC com.mashibing.jvm.gc.T15_FullGC_Problem01一般是运维团队首先受到报警信息CPU Memorytop命令观察到问题内存不断增长 CPU占用率居高不下top -Hp 观察进程中的线程哪个线程CPU和内存占比高jps定位具体java进程jstack 定位线程状况重点关注WAITING BLOCKEDeg.waiting on 0x0000000088ca3310 (a java.lang.Object)假如有一个进程中100个线程很多线程都在waiting on 一定要找到是哪个线程持有这把锁怎么找搜索jstack dump的信息找 看哪个线程持有这把锁RUNNABLE作业1写一个死锁程序用jstack观察 2 写一个程序一个线程持有锁不释放其他线程等待为什么阿里规范里规定线程的名称尤其是线程池都要写有意义的名称怎么样自定义线程池里的线程名称自定义ThreadFactoryjinfo pidjstat -gc 动态观察gc情况 / 阅读GC日志发现频繁GC / arthas观察 / jconsole/jvisualVM/ Jprofiler最好用jstat -gc 4655 500 : 每个500个毫秒打印GC的情况如果面试官问你是怎么定位OOM问题的如果你回答用图形界面错误1已经上线的系统不用图形界面用什么cmdline arthas2图形界面到底用在什么地方测试测试的时候进行监控压测观察jmap - histo 4655 | head -20查找有多少对象产生jmap -dump:formatb,filexxx pid 线上系统内存特别大jmap执行期间会对进程产生很大影响甚至卡顿电商不适合1设定了参数HeapDumpOOM的时候会自动产生堆转储文件2很多服务器备份高可用停掉这台服务器对其他服务器不影响3在线定位(一般小点儿公司用不到)java -Xms20M -Xmx20M -XX:UseParallelGC -XX:HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01使用MAT / jhat /jvisualvm 进行dump文件分析https://www.cnblogs.com/baihuitestsoftware/articles/6406271.htmljhat -J-mx512M xxx.dumphttp://192.168.17.11:7000拉到最后找到对应链接可以使用OQL查找特定问题对象找到代码的问题
jconsole远程连接
1、程序启动加入参数
java -Djava.rmi.server.hostname192.168.17.11
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port11111
-Dcom.sun.management.jmxremote.authenticatefalse
-Dcom.sun.management.jmxremote.sslfalse XXX2、如果遭遇 Local host name unknownXXX的错误修改/etc/hosts文件把XXX加入进去
192.168.17.11 basic localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain63、关闭linux防火墙实战中应该打开对应端口
service iptables stop
chkconfig iptables off #永久关闭4、windows上打开 jconsole远程连接 192.168.17.11:11111
jvisualvm远程连接
https://www.cnblogs.com/liugh/p/7620336.html 简单做法
arthas在线排查工具
为什么需要在线排查在生产上我们经常会碰到一些不好排查的问题例如线程安全问题用最简单的threaddump或者heapdump不好查到问题原因。为了排查这些问题有时我们会临时加一些日志比如在一些关键的函数里打印出入参然后重新打包发布如果打了日志还是没找到问题继续加日志重新打包发布。对于上线流程复杂而且审核比较严的公司从改代码到上线需要层层的流转会大大影响问题排查的进度。观察jvm信息thread定位线程问题dashboard 观察系统情况heapdump jhat分析jad反编译动态代理生成类的问题定位第三方的类观察代码版本问题确定自己最新提交的版本是不是被使用redefine 热替换目前有些限制条件只能改方法实现方法已经运行完成不能改方法名 不能改属性m() - mm()sc - search classwatch - watch method没有包含的功能jmap
案例汇总
OOM产生的原因多种多样有些程序未必产生OOM不断FGC(CPU飙高但内存回收特别少) 上面案例
硬件升级系统反而卡顿的问题见上线程池不当运用产生OOM问题见上不断的往List里加对象实在太LOWsmile jira问题实际系统不断重启解决问题 加内存 更换垃圾回收器 G1真正问题在哪儿不知道tomcat http-header-size过大问题Hectorlambda表达式导致方法区溢出问题(MethodArea / Perm Metaspace)LambdaGC.java -XX:MaxMetaspaceSize9M -XX:PrintGCDetails
C:\Program Files\Java\jdk1.8.0_181\bin\java.exe -XX:MaxMetaspaceSize9M -XX:PrintGCDetails -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\lib\idea_rt.jar49316:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\bin -Dfile.encodingUTF-8 -classpath C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\work\ijprojects\JVM\out\production\JVM;C:\work\ijprojects\ObjectSize\out\artifacts\ObjectSize_jar\ObjectSize.jar com.mashibing.jvm.gc.LambdaGC
[GC (Metadata GC Threshold) [PSYoungGen: 11341K-1880K(38400K)] 11341K-1888K(125952K), 0.0022190 secs] [Times: user0.00 sys0.00, real0.00 secs]
[Full GC (Metadata GC Threshold) [PSYoungGen: 1880K-0K(38400K)] [ParOldGen: 8K-1777K(35328K)] 1888K-1777K(73728K), [Metaspace: 8164K-8164K(1056768K)], 0.0100681 secs] [Times: user0.02 sys0.00, real0.01 secs]
[GC (Last ditch collection) [PSYoungGen: 0K-0K(38400K)] 1777K-1777K(73728K), 0.0005698 secs] [Times: user0.00 sys0.00, real0.00 secs]
[Full GC (Last ditch collection) [PSYoungGen: 0K-0K(38400K)] [ParOldGen: 1777K-1629K(67584K)] 1777K-1629K(105984K), [Metaspace: 8164K-8156K(1056768K)], 0.0124299 secs] [Times: user0.06 sys0.00, real0.01 secs]
java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:388)at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
Caused by: java.lang.OutOfMemoryError: Compressed class spaceat sun.misc.Unsafe.defineClass(Native Method)at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)at java.security.AccessController.doPrivileged(Native Method)at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:112)at sun.reflect.ReflectionFactory.generateConstructor(ReflectionFactory.java:398)at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:360)at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1574)at java.io.ObjectStreamClass.access$1500(ObjectStreamClass.java:79)at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:519)at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:494)at java.security.AccessController.doPrivileged(Native Method)at java.io.ObjectStreamClass.init(ObjectStreamClass.java:494)at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:391)at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1134)at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)at javax.management.remote.rmi.RMIConnectorServer.encodeJRMPStub(RMIConnectorServer.java:727)at javax.management.remote.rmi.RMIConnectorServer.encodeStub(RMIConnectorServer.java:719)at javax.management.remote.rmi.RMIConnectorServer.encodeStubInAddress(RMIConnectorServer.java:690)at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:439)at sun.management.jmxremote.ConnectorBootstrap.startLocalConnectorServer(ConnectorBootstrap.java:550)at sun.management.Agent.startLocalManagementAgent(Agent.java:137)直接内存溢出问题少见《深入理解Java虚拟机》P59使用Unsafe分配直接内存或者使用NIO的问题栈溢出问题-Xss设定太小比较一下这两段程序的异同分析哪一个是更优的写法
Object o null;
for(int i0; i100; i) {o new Object();//业务处理
}
for(int i0; i100; i) {Object o new Object();
}重写finalize引发频繁GC小米云HBase同步系统系统通过nginx访问超时报警最后排查C程序员重写finalize引发频繁GC问题为什么C程序员会重写finalizenew deletefinalize耗时比较长200ms如果有一个系统内存一直消耗不超过10%但是观察GC日志发现FGC总是频繁产生会是什么引起的System.gc() (这个比较Low)Distuptor有个可以设置链的长度如果过大然后对象大消费完不主动释放会溢出 (来自 死物风情)用jvm都会溢出mycat用崩过1.6.5某个临时版本解析sql子查询算法有问题9个exists的联合sql就导致生成几百万的对象来自 死物风情new 大量线程会产生 native thread OOMlow应该用线程池解决方案减少堆空间太TMlow了,预留更多内存产生native threadJVM内存占物理内存比例 50% - 80%
问答
-XX:MaxTenuringThreshold控制的是什么A: 对象升入老年代的年龄 B: 老年代触发FGC时的内存垃圾比例生产环境中倾向于将最大堆内存和最小堆内存设置为为什么A: 相同 B不同JDK1.8默认的垃圾回收器是A: ParNew CMS B: G1 C: PS ParallelOld D: 以上都不是什么是响应时间优先什么是吞吐量优先ParNew和PS的区别是什么ParNew和ParallelOld的区别是什么年代不同算法不同长时间计算的场景应该选择A停顿时间 B: 吞吐量大规模电商网站应该选择A停顿时间 B: 吞吐量HotSpot的垃圾收集器最常用有哪些常见的HotSpot垃圾收集器组合有哪些JDK1.7 1.8 1.9的默认垃圾回收器是什么如何查看所谓调优到底是在调什么如果采用PS ParrallelOld组合怎么做才能让系统基本不产生FGC如果采用ParNew CMS组合怎样做才能够让系统基本不产生FGC1.加大JVM内存2.加大Young的比例3.提高Y-O的年龄4.提高S区比例5.避免代码内存泄漏G1是否分代G1垃圾回收器会产生FGC吗如果G1产生FGC你应该做什么 a. 扩内存 b. 提高CPU性能回收的快业务逻辑产生对象的速度固定垃圾回收越快内存空间越大 c. 降低MixedGC触发的阈值让MixedGC提早发生默认是45%问生产环境中能够随随便便的dump吗小堆影响不大大堆会有服务暂停或卡顿加live可以缓解dump前会有FGC问常见的OOM问题有哪些栈 堆 MethodArea 直接内存
参考链接
https://blogs.oracle.com/jonthecollector/our-collectorshttps://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.htmlhttp://java.sun.com/javase/technologies/hotspot/vmoptions.jspJVM调优参考文档https://docs.oracle.com/en/java/javase/13/gctuning/introduction-garbage-collection-tuning.html#GUID-8A443184-7E07-4B71-9777-4F12947C8184https://www.cnblogs.com/nxlhero/p/11660854.html 在线排查工具https://www.jianshu.com/p/507f7e0cc3a3 arthas常用命令Arthas手册 a. 启动arthas java -jar arthas-boot.jar b. 绑定java进程 c. dashboard命令观察系统整体情况 d. help 查看帮助 e. help xx 查看具体命令帮助jmap命令参考 https://www.jianshu.com/p/507f7e0cc3a3 a. jmap -heap pid b. jmap -histo pid c. jmap -clstats pid