Java JVM瞎搞

Posted by Zeusro on June 21, 2018
👈🏻 Select language

常用的垃圾收集器

ParNew 收集器

-XX:ParallelGCThreads 限制垃圾收集的线程数

Parallel Scavenge收集器

最大垃圾收集停顿时间 -XX:MaxGCPauseMillis 吞吐量大小 -XX:GCTimeRatio

调低最大垃圾收集停顿时间以牺牲吞吐量和新生代空间作为代价,直接导致垃圾收集变得更加频繁

新手向操作: -XX:UseAdaptiveSizePolicy GC 自适应调节策略

CMS 收集器

以获取最短回收停顿时间为目标的收集器,基于”标记-清除”实现. 核心优点:并发手机,低停顿

  • 阿里云监控的案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/acs/user/monitoragent/jre/bin/java -server 
-Xmx128m 
-Xms128m 
-Xmn70m 
-XX:SurvivorRatio=10 
-XX:PermSize=25m 
-XX:MaxPermSize=30m 
-XX:+DisableExplicitGC 
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:+CMSClassUnloadingEnabled 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70 
-XX:+UseParNewGC 
-verbose:gc 
-Xloggc:/acs/monitor/system/monitoragent/logs/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Duser.timezone=GMT+8 
-Djava.endorsed.dirs= 
-classpath /acs/user/monitoragent/lib:/acs/user/monitoragent/lib/aliyun-openservices-sls-v0.3-inner-0.1.0.jar:/acs/user/monitoragent/lib/aliyun-openservices-with-mqs.1.0.12.jar:/acs/user/monitoragent/lib/commons-beanutils-1.8.3.jar:/acs/user/monitoragent/lib/commons-codec-1.4.jar:/acs/user/monitoragent/lib/commons-collections-3.2.1.jar:/acs/user/monitoragent/lib/commons-digester-1.8.jar:/acs/user/monitoragent/lib/commons-httpclient-3.1.jar:/acs/user/monitoragent/lib/commons-lang-2.6.jar:/acs/user/monitoragent/lib/commons-lang3-3.1.jar:/acs/user/monitoragent/lib/commons-logging-1.0.4.jar:/acs/user/monitoragent/lib/commons-validator-1.4.0.jar:/acs/user/monitoragent/lib/diamond-client-3.6.7.jar:/acs/user/monitoragent/lib/diamond-utils-3.1.3.jar:/acs/user/monitoragent/lib/ezmorph-1.0.6.jar:/acs/user/monitoragent/lib/fastjson-1.2.41.jar:/acs/user/monitoragent/lib/hamcrest-core-1.1.jar:/acs/user/monitoragent/lib/httpclient-4.2.1.jar:/acs/user/monitoragent/lib/httpcore-4.2.1.jar:/acs/user/monitoragent/lib/jackson-core-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jackson-mapper-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jdom-1.1.jar:/acs/user/monitoragent/lib/json-lib-2.4-jdk15.jar:/acs/user/monitoragent/lib/junit-4.10.jar:/acs/user/monitoragent/lib/log4j-1.2.17.jar:/acs/user/monitoragent/lib/mysql-connector-java-5.1.25.jar:/acs/user/monitoragent/lib/netty-all-4.0.36.Final.jar:/acs/user/monitoragent/lib/nginx.agent.jar:/acs/user/monitoragent/lib/ons-api-1.1.5.jar:/acs/user/monitoragent/lib/ons-client-1.1.5.jar:/acs/user/monitoragent/lib/protobuf-java-2.4.1.jar:/acs/user/monitoragent/lib/rocketmq-client-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-common-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-remoting-3.6.4.jar:/acs/user/monitoragent/lib/slf4j-api-1.7.5.jar:/acs/user/monitoragent/lib/slf4j-log4j12-1.7.5.jar:/acs/user/monitoragent/lib/test.junit-4.8.1.jar:/acs/user/monitoragent/lib/test.junit.hamcrest-1.1.jar: -Dagent.home=/acs/user/monitoragent com.alibaba.ace.nginx.agent.Startup /acs/user/monitoragent/conf

G1收集器

https://t.hao0.me/jvm/2017/01/15/jvm-g1.html

ConcMarkSweepGC

推荐使用的是-Xmn参数,原因是这个参数很简洁,相当于一次性设定NewSize和MaxNewSIze,而且两者相等。-Xmn配合-Xms堆起始大小和-Xmx堆最大大小,恰好把堆内存布局确定完了(估计设计者也是因为简洁的原因,弄出了三个简写参数)。另外,官文似乎说-Xmn是1.4才开始支持的,但是如今应该没有还在用1.4之前的JRE的吧。

  • 使用例子
1
2
3
4
5
6
7
8
9
10
java -jar 
-Xms10g 
-Xmx15g 
-XX:+UseConcMarkSweepGC 
-XX:NewSize=6g 
-XX:MaxNewSize=6g 
-verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps  
-Xloggc:./log/gc.log Slaver.jar

jvm分析工具

jstat

jstat的好处是内置在jvm 中,使用简单粗暴

1
2
3
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
pid=1
jstat -gc $pid 3000 3000
1
2
3
4
5
6
7
8
9
10
11
12
–class 监视类装载、卸载数量、总空间及类装载所耗费的时间
–gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量
–gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间
–gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
–gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
–gcnew 监视新生代GC的状况
–gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间
–gcold 监视老年代GC的状况
–gcoldcapacity 监视内容与——gcold基本相同,输出主要关注使用到的最大和最小空间
–gcpermcapacity 输出永久代使用到的最大和最小空间
–compiler 输出JIT编译器编译过的方法、耗时等信息
–printcompilation 输出已经被JIT编译的方法

1、jstat –class : 显示加载class的数量,及所占空间等信息。

1
2
3
4
5
Loaded 装载的类的数量
Bytes 装载类所占用的字节数
Unloaded 卸载类的数量
Bytes 卸载类的字节数
Time 装载和卸载类所花费的时间

2、jstat -compiler 显示VM实时编译的数量等信息。

1
2
3
4
5
6
Compiled 编译任务执行数量
Failed 编译任务执行失败数量
Invalid 编译任务执行失效数量
Time 编译任务消耗时间
FailedType 最后一个编译失败任务的类型
FailedMethod 最后一个编译失败任务所在的类及方法

3、jstat -gc : 可以显示gc的信息,查看gc的次数,及时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
PC Perm(持久代)的容量 (字节)
PU Perm(持久代)目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

4、jstat -gccapacity :可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NGCMN 年轻代(young)中初始化(最小)的大小(字节)
NGCMX 年轻代(young)的最大容量 (字节)
NGC 年轻代(young)中当前的容量 (字节)
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
OGCMN old代中初始化(最小)的大小 (字节)
OGCMX old代的最大容量(字节)
OGC old代当前新生成的容量 (字节)
OC Old代的容量 (字节)
PGCMN perm代中初始化(最小)的大小 (字节)
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节)
PC Perm(持久代)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数

5、jstat -gcutil :统计gc信息

1
2
3
4
5
6
7
8
9
10
S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O old代已使用的占当前容量百分比
P perm代已使用的占当前容量百分比
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

6、jstat -gcnew :年轻代对象的信息。

1
2
3
4
5
6
7
8
9
10
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT 持有次数限制
MTT 最大持有次数限制
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)

7、jstat -gcnewcapacity: 年轻代对象的信息及其占用量。

1
2
3
4
5
6
7
8
9
10
11
NGCMN 年轻代(young)中初始化(最小)的大小(字节)
NGCMX 年轻代(young)的最大容量 (字节)
NGC 年轻代(young)中当前的容量 (字节)
S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX 年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX 年轻代中Eden(伊甸园)的最大容量 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数

8、jstat -gcold :old代对象的信息。

1
2
3
4
5
6
7
8
PC Perm(持久代)的容量 (字节)
PU Perm(持久代)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

9、stat -gcoldcapacity : old代对象的信息及其占用量。

1
2
3
4
5
6
7
8
OGCMN old代中初始化(最小)的大小 (字节)
OGCMX old代的最大容量(字节)
OGC old代当前新生成的容量 (字节)
OC Old代的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

10、jstat -gcpermcapacity: perm对象的信息及其占用量。

1
2
3
4
5
6
7
8
PGCMN perm代中初始化(最小)的大小 (字节)
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节)
PC Perm(持久代)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

11、jstat -printcompilation :当前VM执行的信息。

1
2
3
4
Compiled 编译任务的数目
Size 方法生成的字节码的大小
Type 编译类型
Method 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

MemoryAnalyzer

参考链接

  1. JVM调优:选择合适的GC collector (三)
  2. 深入理解 Java G1 垃圾收集器
  3. 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
  4. 成为JavaGC专家(2)—如何监控Java垃圾回收机制
  5. 成为Java GC专家(3)—如何优化Java垃圾回收机制
  6. 成为Java GC专家(4)—Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响
  7. JVM系列三:JVM参数设置、分析
  8. 介绍Java GC种类,并更换 调优GC
  9. Java 垃圾回收机制(以及怎么减少调用GC,提高性能)
  10. What Is Garbage Collection?
  11. 频繁GC (Allocation Failure)及young gc时间过长分析
  12. JVM系列三:JVM参数设置、分析
  13. javaGC调优
  14. Java Hotspot G1 GC的一些关键技术
  15. JVM
  16. JVM(java 虚拟机)内存设置
  17. java jstat 用法
  18. jstat命令详解
  19. jstat使用详解(分析JVM的使用情况)
  20. java类的加载机制
  21. G1(Garbage First)的使用
  22. Java命令学习系列(4):Jstat
  23. JVM问题分析处理手册
  24. JVM调优总结 -Xms -Xmx -Xmn -Xss

Common Garbage Collectors

ParNew Collector

-XX:ParallelGCThreads Limit the number of garbage collection threads

Parallel Scavenge Collector

Maximum garbage collection pause time -XX:MaxGCPauseMillis Throughput size -XX:GCTimeRatio

Lowering maximum garbage collection pause time comes at the cost of throughput and new generation space, directly causing garbage collection to become more frequent

Beginner-friendly operation: -XX:UseAdaptiveSizePolicy GC adaptive adjustment strategy

CMS Collector

A collector targeting shortest recovery pause time, implemented based on “mark-sweep”. Core advantage: concurrent collection, low pause

  • Alibaba Cloud monitoring case
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/acs/user/monitoragent/jre/bin/java -server 
-Xmx128m 
-Xms128m 
-Xmn70m 
-XX:SurvivorRatio=10 
-XX:PermSize=25m 
-XX:MaxPermSize=30m 
-XX:+DisableExplicitGC 
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:+CMSClassUnloadingEnabled 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70 
-XX:+UseParNewGC 
-verbose:gc 
-Xloggc:/acs/monitor/system/monitoragent/logs/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Duser.timezone=GMT+8 
-Djava.endorsed.dirs= 
-classpath /acs/user/monitoragent/lib:/acs/user/monitoragent/lib/aliyun-openservices-sls-v0.3-inner-0.1.0.jar:/acs/user/monitoragent/lib/aliyun-openservices-with-mqs.1.0.12.jar:/acs/user/monitoragent/lib/commons-beanutils-1.8.3.jar:/acs/user/monitoragent/lib/commons-codec-1.4.jar:/acs/user/monitoragent/lib/commons-collections-3.2.1.jar:/acs/user/monitoragent/lib/commons-digester-1.8.jar:/acs/user/monitoragent/lib/commons-httpclient-3.1.jar:/acs/user/monitoragent/lib/commons-lang-2.6.jar:/acs/user/monitoragent/lib/commons-lang3-3.1.jar:/acs/user/monitoragent/lib/commons-logging-1.0.4.jar:/acs/user/monitoragent/lib/commons-validator-1.4.0.jar:/acs/user/monitoragent/lib/diamond-client-3.6.7.jar:/acs/user/monitoragent/lib/diamond-utils-3.1.3.jar:/acs/user/monitoragent/lib/ezmorph-1.0.6.jar:/acs/user/monitoragent/lib/fastjson-1.2.41.jar:/acs/user/monitoragent/lib/hamcrest-core-1.1.jar:/acs/user/monitoragent/lib/httpclient-4.2.1.jar:/acs/user/monitoragent/lib/httpcore-4.2.1.jar:/acs/user/monitoragent/lib/jackson-core-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jackson-mapper-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jdom-1.1.jar:/acs/user/monitoragent/lib/json-lib-2.4-jdk15.jar:/acs/user/monitoragent/lib/junit-4.10.jar:/acs/user/monitoragent/lib/log4j-1.2.17.jar:/acs/user/monitoragent/lib/mysql-connector-java-5.1.25.jar:/acs/user/monitoragent/lib/netty-all-4.0.36.Final.jar:/acs/user/monitoragent/lib/nginx.agent.jar:/acs/user/monitoragent/lib/ons-api-1.1.5.jar:/acs/user/monitoragent/lib/ons-client-1.1.5.jar:/acs/user/monitoragent/lib/protobuf-java-2.4.1.jar:/acs/user/monitoragent/lib/rocketmq-client-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-common-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-remoting-3.6.4.jar:/acs/user/monitoragent/lib/slf4j-api-1.7.5.jar:/acs/user/monitoragent/lib/slf4j-log4j12-1.7.5.jar:/acs/user/monitoragent/lib/test.junit-4.8.1.jar:/acs/user/monitoragent/lib/test.junit.hamcrest-1.1.jar: -Dagent.home=/acs/user/monitoragent com.alibaba.ace.nginx.agent.Startup /acs/user/monitoragent/conf

G1 Collector

https://t.hao0.me/jvm/2017/01/15/jvm-g1.html

ConcMarkSweepGC

The recommended parameter is -Xmn, because this parameter is very concise, equivalent to setting NewSize and MaxNewSize at once, and both are equal. -Xmn combined with -Xms heap starting size and -Xmx heap maximum size, exactly determines the heap memory layout (the designer probably also created three shorthand parameters for simplicity). Also, the official docs seem to say -Xmn started being supported in 1.4, but nowadays there shouldn’t be anyone still using JRE before 1.4, right?

  • Usage example
1
2
3
4
5
6
7
8
9
10
java -jar 
-Xms10g 
-Xmx15g 
-XX:+UseConcMarkSweepGC 
-XX:NewSize=6g 
-XX:MaxNewSize=6g 
-verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps  
-Xloggc:./log/gc.log Slaver.jar

JVM Analysis Tools

jstat

jstat’s advantage is that it’s built into the JVM, simple and brutal to use

1
2
3
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
pid=1
jstat -gc $pid 3000 3000
1
2
3
4
5
6
7
8
9
10
11
12
–class Monitor class loading, unloading count, total space and time spent loading classes
–gc Monitor Java heap status, including Eden area, 2 Survivor areas, old generation, permanent generation capacity, etc.
–gccapacity Monitor content is basically the same as -gc, but output mainly focuses on maximum and minimum space used in each Java heap area
–gcutil Monitor content is basically the same as -gc, but output mainly focuses on percentage of used space to total space
–gccause Same function as -gcutil, but will additionally output the cause of the last GC
–gcnew Monitor new generation GC status
–gcnewcapacity Monitor content is basically the same as -gcnew, output mainly focuses on maximum and minimum space used
–gcold Monitor old generation GC status
–gcoldcapacity Monitor content is basically the same as ——gcold, output mainly focuses on maximum and minimum space used
–gcpermcapacity Output maximum and minimum space used in permanent generation
–compiler Output methods compiled by JIT compiler, time consumed, etc.
–printcompilation Output methods that have been JIT compiled
  1. jstat –class : Display loaded class count, space occupied, etc.
    1
    2
    3
    4
    5
    
    Loaded Number of loaded classes
    Bytes Bytes occupied by loaded classes
    Unloaded Number of unloaded classes
    Bytes Bytes of unloaded classes
    Time Time spent loading and unloading classes
    
  2. jstat -compiler Display VM real-time compilation count, etc.
    1
    2
    3
    4
    5
    6
    
    Compiled Number of compilation tasks executed
    Failed Number of compilation task execution failures
    Invalid Number of compilation task execution invalidations
    Time Time consumed by compilation tasks
    FailedType Type of the last failed compilation task
    FailedMethod Class and method where the last failed compilation task is located
    
  3. jstat -gc : Can display GC information, view GC count and time.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    S0C Capacity of first survivor (survivor area) in young generation (bytes)
    S1C Capacity of second survivor (survivor area) in young generation (bytes)
    S0U Currently used space of first survivor (survivor area) in young generation (bytes)
    S1U Currently used space of second survivor (survivor area) in young generation (bytes)
    EC Capacity of Eden (Garden of Eden) in young generation (bytes)
    EU Currently used space of Eden (Garden of Eden) in young generation (bytes)
    OC Capacity of Old generation (bytes)
    OU Currently used space of Old generation (bytes)
    PC Capacity of Perm (persistent generation) (bytes)
    PU Currently used space of Perm (persistent generation) (bytes)
    YGC Number of GCs in young generation from application startup to sampling
    YGCT Time spent on GCs in young generation from application startup to sampling (s)
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    FGCT Time spent on GCs in old generation (full GC) from application startup to sampling (s)
    GCT Total time spent on GC from application startup to sampling (s)
    
  4. jstat -gccapacity : Can display usage and occupied size of three generations (young, old, perm) objects in VM memory
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    NGCMN Initialized (minimum) size in young generation (young) (bytes)
    NGCMX Maximum capacity of young generation (young) (bytes)
    NGC Current capacity of young generation (young) (bytes)
    S0C Capacity of first survivor (survivor area) in young generation (bytes)
    S1C Capacity of second survivor (survivor area) in young generation (bytes)
    EC Capacity of Eden (Garden of Eden) in young generation (bytes)
    OGCMN Initialized (minimum) size in old generation (bytes)
    OGCMX Maximum capacity of old generation (bytes)
    OGC Currently newly generated capacity of old generation (bytes)
    OC Capacity of Old generation (bytes)
    PGCMN Initialized (minimum) size in perm generation (bytes)
    PGCMX Maximum capacity of perm generation (bytes)
    PGC Currently newly generated capacity of perm generation (bytes)
    PC Capacity of Perm (persistent generation) (bytes)
    YGC Number of GCs in young generation from application startup to sampling
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    
  5. jstat -gcutil : Statistics GC information
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    S0 Percentage of used space of first survivor (survivor area) in young generation to current capacity
    S1 Percentage of used space of second survivor (survivor area) in young generation to current capacity
    E Percentage of used space of Eden (Garden of Eden) in young generation to current capacity
    O Percentage of used space of old generation to current capacity
    P Percentage of used space of perm generation to current capacity
    YGC Number of GCs in young generation from application startup to sampling
    YGCT Time spent on GCs in young generation from application startup to sampling (s)
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    FGCT Time spent on GCs in old generation (full GC) from application startup to sampling (s)
    GCT Total time spent on GC from application startup to sampling (s)
    
  6. jstat -gcnew : Information about young generation objects.
1
2
3
4
5
6
7
8
9
10
S0C Capacity of first survivor (survivor area) in young generation (bytes)
S1C Capacity of second survivor (survivor area) in young generation (bytes)
S0U Currently used space of first survivor (survivor area) in young generation (bytes)
S1U Currently used space of second survivor (survivor area) in young generation (bytes)
TT Holding count limit
MTT Maximum holding count limit
EC Capacity of Eden (Garden of Eden) in young generation (bytes)
EU Currently used space of Eden (Garden of Eden) in young generation (bytes)
YGC Number of GCs in young generation from application startup to sampling
YGCT Time spent on GCs in young generation from application startup to sampling (s)
  1. jstat -gcnewcapacity: Information about young generation objects and their usage.
1
2
3
4
5
6
7
8
9
10
11
NGCMN Initialized (minimum) size in young generation (young) (bytes)
NGCMX Maximum capacity of young generation (young) (bytes)
NGC Current capacity of young generation (young) (bytes)
S0CMX Maximum capacity of first survivor (survivor area) in young generation (bytes)
S0C Capacity of first survivor (survivor area) in young generation (bytes)
S1CMX Maximum capacity of second survivor (survivor area) in young generation (bytes)
S1C Capacity of second survivor (survivor area) in young generation (bytes)
ECMX Maximum capacity of Eden (Garden of Eden) in young generation (bytes)
EC Capacity of Eden (Garden of Eden) in young generation (bytes)
YGC Number of GCs in young generation from application startup to sampling
FGC Number of GCs in old generation (full GC) from application startup to sampling
  1. jstat -gcold : Information about old generation objects.
    1
    2
    3
    4
    5
    6
    7
    8
    
    PC Capacity of Perm (persistent generation) (bytes)
    PU Currently used space of Perm (persistent generation) (bytes)
    OC Capacity of Old generation (bytes)
    OU Currently used space of Old generation (bytes)
    YGC Number of GCs in young generation from application startup to sampling
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    FGCT Time spent on GCs in old generation (full GC) from application startup to sampling (s)
    GCT Total time spent on GC from application startup to sampling (s)
    
  2. stat -gcoldcapacity : Information about old generation objects and their usage.
    1
    2
    3
    4
    5
    6
    7
    8
    
    OGCMN Initialized (minimum) size in old generation (bytes)
    OGCMX Maximum capacity of old generation (bytes)
    OGC Currently newly generated capacity of old generation (bytes)
    OC Capacity of Old generation (bytes)
    YGC Number of GCs in young generation from application startup to sampling
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    FGCT Time spent on GCs in old generation (full GC) from application startup to sampling (s)
    GCT Total time spent on GC from application startup to sampling (s)
    
  3. jstat -gcpermcapacity: Information about perm objects and their usage.
    1
    2
    3
    4
    5
    6
    7
    8
    
    PGCMN Initialized (minimum) size in perm generation (bytes)
    PGCMX Maximum capacity of perm generation (bytes)
    PGC Currently newly generated capacity of perm generation (bytes)
    PC Capacity of Perm (persistent generation) (bytes)
    YGC Number of GCs in young generation from application startup to sampling
    FGC Number of GCs in old generation (full GC) from application startup to sampling
    FGCT Time spent on GCs in old generation (full GC) from application startup to sampling (s)
    GCT Total time spent on GC from application startup to sampling (s)
    
  4. jstat -printcompilation : Current VM execution information.
    1
    2
    3
    4
    
    Compiled Number of compilation tasks
    Size Size of bytecode generated by methods
    Type Compilation type
    Method Class name and method name used to identify compiled methods. Class names use / as a namespace separator. Method name is the method in the given class. The above format is set by the -XX:+PrintComplation option
    

MemoryAnalyzer

References

  1. JVM Tuning: Choosing the Right GC Collector (Three)
  2. Deep Understanding of Java G1 Garbage Collector
  3. Becoming a JavaGC Expert (1)—In-depth and Easy-to-understand Java Garbage Collection Mechanism
  4. Becoming a JavaGC Expert (2)—How to Monitor Java Garbage Collection Mechanism
  5. Becoming a Java GC Expert (3)—How to Optimize Java Garbage Collection Mechanism
  6. Becoming a Java GC Expert (4)—Detailed Explanation of Apache’s MaxClients Parameter and Its Impact on Tomcat FullGC Execution
  7. JVM Series Three: JVM Parameter Settings and Analysis
  8. Introducing Java GC Types and Replacing/Tuning GC
  9. Java Garbage Collection Mechanism (and How to Reduce GC Calls and Improve Performance)
  10. What Is Garbage Collection?
  11. Frequent GC (Allocation Failure) and Long Young GC Time Analysis
  12. JVM Series Three: JVM Parameter Settings and Analysis
  13. javaGC Tuning
  14. Some Key Technologies of Java Hotspot G1 GC
  15. JVM
  16. JVM (java virtual machine) Memory Settings
  17. java jstat Usage
  18. jstat Command Detailed Explanation
  19. jstat Usage Detailed Explanation (Analyzing JVM Usage)
  20. java Class Loading Mechanism
  21. G1(Garbage First) Usage
  22. Java Command Learning Series (4): Jstat
  23. JVM Problem Analysis and Handling Manual
  24. JVM Tuning Summary -Xms -Xmx -Xmn -Xss

Обычные сборщики мусора

Сборщик ParNew

-XX:ParallelGCThreads Ограничивает количество потоков сборки мусора

Сборщик Parallel Scavenge

Максимальное время паузы сборки мусора -XX:MaxGCPauseMillis Размер пропускной способности -XX:GCTimeRatio

Снижение максимального времени паузы сборки мусора происходит за счёт пропускной способности и пространства нового поколения, напрямую приводя к более частой сборке мусора

Операция для новичков: -XX:UseAdaptiveSizePolicy Стратегия адаптивной регулировки GC

Сборщик CMS

Сборщик, нацеленный на получение кратчайшего времени паузы восстановления, реализованный на основе “маркировка-очистка”. Основное преимущество: параллельная сборка, низкая пауза

  • Случай мониторинга Alibaba Cloud
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/acs/user/monitoragent/jre/bin/java -server 
-Xmx128m 
-Xms128m 
-Xmn70m 
-XX:SurvivorRatio=10 
-XX:PermSize=25m 
-XX:MaxPermSize=30m 
-XX:+DisableExplicitGC 
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:+CMSClassUnloadingEnabled 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70 
-XX:+UseParNewGC 
-verbose:gc 
-Xloggc:/acs/monitor/system/monitoragent/logs/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Duser.timezone=GMT+8 
-Djava.endorsed.dirs= 
-classpath /acs/user/monitoragent/lib:/acs/user/monitoragent/lib/aliyun-openservices-sls-v0.3-inner-0.1.0.jar:/acs/user/monitoragent/lib/aliyun-openservices-with-mqs.1.0.12.jar:/acs/user/monitoragent/lib/commons-beanutils-1.8.3.jar:/acs/user/monitoragent/lib/commons-codec-1.4.jar:/acs/user/monitoragent/lib/commons-collections-3.2.1.jar:/acs/user/monitoragent/lib/commons-digester-1.8.jar:/acs/user/monitoragent/lib/commons-httpclient-3.1.jar:/acs/user/monitoragent/lib/commons-lang-2.6.jar:/acs/user/monitoragent/lib/commons-lang3-3.1.jar:/acs/user/monitoragent/lib/commons-logging-1.0.4.jar:/acs/user/monitoragent/lib/commons-validator-1.4.0.jar:/acs/user/monitoragent/lib/diamond-client-3.6.7.jar:/acs/user/monitoragent/lib/diamond-utils-3.1.3.jar:/acs/user/monitoragent/lib/ezmorph-1.0.6.jar:/acs/user/monitoragent/lib/fastjson-1.2.41.jar:/acs/user/monitoragent/lib/hamcrest-core-1.1.jar:/acs/user/monitoragent/lib/httpclient-4.2.1.jar:/acs/user/monitoragent/lib/httpcore-4.2.1.jar:/acs/user/monitoragent/lib/jackson-core-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jackson-mapper-lgpl-1.9.6.jar:/acs/user/monitoragent/lib/jdom-1.1.jar:/acs/user/monitoragent/lib/json-lib-2.4-jdk15.jar:/acs/user/monitoragent/lib/junit-4.10.jar:/acs/user/monitoragent/lib/log4j-1.2.17.jar:/acs/user/monitoragent/lib/mysql-connector-java-5.1.25.jar:/acs/user/monitoragent/lib/netty-all-4.0.36.Final.jar:/acs/user/monitoragent/lib/nginx.agent.jar:/acs/user/monitoragent/lib/ons-api-1.1.5.jar:/acs/user/monitoragent/lib/ons-client-1.1.5.jar:/acs/user/monitoragent/lib/protobuf-java-2.4.1.jar:/acs/user/monitoragent/lib/rocketmq-client-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-common-3.6.4.jar:/acs/user/monitoragent/lib/rocketmq-remoting-3.6.4.jar:/acs/user/monitoragent/lib/slf4j-api-1.7.5.jar:/acs/user/monitoragent/lib/slf4j-log4j12-1.7.5.jar:/acs/user/monitoragent/lib/test.junit-4.8.1.jar:/acs/user/monitoragent/lib/test.junit.hamcrest-1.1.jar: -Dagent.home=/acs/user/monitoragent com.alibaba.ace.nginx.agent.Startup /acs/user/monitoragent/conf

Сборщик G1

https://t.hao0.me/jvm/2017/01/15/jvm-g1.html

ConcMarkSweepGC

Рекомендуемый параметр — -Xmn, потому что этот параметр очень лаконичен, эквивалентен одноразовой установке NewSize и MaxNewSize, и оба равны. -Xmn в сочетании с -Xms начальным размером кучи и -Xmx максимальным размером кучи точно определяет расположение памяти кучи (дизайнер, вероятно, также создал три сокращённых параметра для простоты). Кроме того, официальные документы, кажется, говорят, что -Xmn начал поддерживаться в 1.4, но в наши дни не должно быть никого, кто всё ещё использует JRE до 1.4, верно?

  • Пример использования
1
2
3
4
5
6
7
8
9
10
java -jar 
-Xms10g 
-Xmx15g 
-XX:+UseConcMarkSweepGC 
-XX:NewSize=6g 
-XX:MaxNewSize=6g 
-verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps  
-Xloggc:./log/gc.log Slaver.jar

Инструменты анализа JVM

jstat

Преимущество jstat в том, что он встроен в JVM, прост и прямолинеен в использовании

1
2
3
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
pid=1
jstat -gc $pid 3000 3000
1
2
3
4
5
6
7
8
9
10
11
12
–class Мониторинг загрузки, выгрузки классов, общего пространства и времени, затраченного на загрузку классов
–gc Мониторинг состояния кучи Java, включая область Eden, 2 области Survivor, старое поколение, постоянное поколение и т.д.
–gccapacity Содержимое мониторинга в основном такое же, как -gc, но вывод в основном фокусируется на максимальном и минимальном пространстве, используемом в каждой области кучи Java
–gcutil Содержимое мониторинга в основном такое же, как -gc, но вывод в основном фокусируется на проценте используемого пространства к общему пространству
–gccause Та же функция, что и -gcutil, но будет дополнительно выводить причину последнего GC
–gcnew Мониторинг статуса GC нового поколения
–gcnewcapacity Содержимое мониторинга в основном такое же, как -gcnew, вывод в основном фокусируется на максимальном и минимальном используемом пространстве
–gcold Мониторинг статуса GC старого поколения
–gcoldcapacity Содержимое мониторинга в основном такое же, как ——gcold, вывод в основном фокусируется на максимальном и минимальном используемом пространстве
–gcpermcapacity Вывод максимального и минимального пространства, используемого в постоянном поколении
–compiler Вывод методов, скомпилированных JIT-компилятором, затраченного времени и т.д.
–printcompilation Вывод методов, которые были скомпилированы JIT
  1. jstat –class : Отображение количества загруженных классов, занимаемого пространства и т.д.
    1
    2
    3
    4
    5
    
    Loaded Количество загруженных классов
    Bytes Байты, занимаемые загруженными классами
    Unloaded Количество выгруженных классов
    Bytes Байты выгруженных классов
    Time Время, затраченное на загрузку и выгрузку классов
    
  2. jstat -compiler Отображение количества компиляций VM в реальном времени и т.д.
    1
    2
    3
    4
    5
    6
    
    Compiled Количество выполненных задач компиляции
    Failed Количество неудачных выполнений задач компиляции
    Invalid Количество недействительных выполнений задач компиляции
    Time Время, затраченное на задачи компиляции
    FailedType Тип последней неудачной задачи компиляции
    FailedMethod Класс и метод, где находится последняя неудачная задача компиляции
    
  3. jstat -gc : Может отображать информацию о GC, просматривать количество и время GC.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    S0C Ёмкость первого выжившего (область выживания) в молодом поколении (байты)
    S1C Ёмкость второго выжившего (область выживания) в молодом поколении (байты)
    S0U В настоящее время используемое пространство первого выжившего (область выживания) в молодом поколении (байты)
    S1U В настоящее время используемое пространство второго выжившего (область выживания) в молодом поколении (байты)
    EC Ёмкость Eden (Эдемский сад) в молодом поколении (байты)
    EU В настоящее время используемое пространство Eden (Эдемский сад) в молодом поколении (байты)
    OC Ёмкость старого поколения (байты)
    OU В настоящее время используемое пространство старого поколения (байты)
    PC Ёмкость Perm (постоянное поколение) (байты)
    PU В настоящее время используемое пространство Perm (постоянное поколение) (байты)
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    YGCT Время, затраченное на GC в молодом поколении от запуска приложения до выборки (с)
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    FGCT Время, затраченное на GC в старом поколении (полный GC) от запуска приложения до выборки (с)
    GCT Общее время, затраченное на GC от запуска приложения до выборки (с)
    
  4. jstat -gccapacity : Может отображать использование и занимаемый размер объектов трёх поколений (young, old, perm) в памяти VM
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    NGCMN Инициализированный (минимальный) размер в молодом поколении (young) (байты)
    NGCMX Максимальная ёмкость молодого поколения (young) (байты)
    NGC Текущая ёмкость молодого поколения (young) (байты)
    S0C Ёмкость первого выжившего (область выживания) в молодом поколении (байты)
    S1C Ёмкость второго выжившего (область выживания) в молодом поколении (байты)
    EC Ёмкость Eden (Эдемский сад) в молодом поколении (байты)
    OGCMN Инициализированный (минимальный) размер в старом поколении (байты)
    OGCMX Максимальная ёмкость старого поколения (байты)
    OGC Текущая вновь сгенерированная ёмкость старого поколения (байты)
    OC Ёмкость старого поколения (байты)
    PGCMN Инициализированный (минимальный) размер в поколении perm (байты)
    PGCMX Максимальная ёмкость поколения perm (байты)
    PGC Текущая вновь сгенерированная ёмкость поколения perm (байты)
    PC Ёмкость Perm (постоянное поколение) (байты)
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    
  5. jstat -gcutil : Статистика информации о GC
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    S0 Процент используемого пространства первого выжившего (область выживания) в молодом поколении к текущей ёмкости
    S1 Процент используемого пространства второго выжившего (область выживания) в молодом поколении к текущей ёмкости
    E Процент используемого пространства Eden (Эдемский сад) в молодом поколении к текущей ёмкости
    O Процент используемого пространства старого поколения к текущей ёмкости
    P Процент используемого пространства поколения perm к текущей ёмкости
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    YGCT Время, затраченное на GC в молодом поколении от запуска приложения до выборки (с)
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    FGCT Время, затраченное на GC в старом поколении (полный GC) от запуска приложения до выборки (с)
    GCT Общее время, затраченное на GC от запуска приложения до выборки (с)
    
  6. jstat -gcnew : Информация об объектах молодого поколения.
1
2
3
4
5
6
7
8
9
10
S0C Ёмкость первого выжившего (область выживания) в молодом поколении (байты)
S1C Ёмкость второго выжившего (область выживания) в молодом поколении (байты)
S0U В настоящее время используемое пространство первого выжившего (область выживания) в молодом поколении (байты)
S1U В настоящее время используемое пространство второго выжившего (область выживания) в молодом поколении (байты)
TT Лимит количества удержаний
MTT Максимальный лимит количества удержаний
EC Ёмкость Eden (Эдемский сад) в молодом поколении (байты)
EU В настоящее время используемое пространство Eden (Эдемский сад) в молодом поколении (байты)
YGC Количество GC в молодом поколении от запуска приложения до выборки
YGCT Время, затраченное на GC в молодом поколении от запуска приложения до выборки (с)
  1. jstat -gcnewcapacity: Информация об объектах молодого поколения и их использовании.
1
2
3
4
5
6
7
8
9
10
11
NGCMN Инициализированный (минимальный) размер в молодом поколении (young) (байты)
NGCMX Максимальная ёмкость молодого поколения (young) (байты)
NGC Текущая ёмкость молодого поколения (young) (байты)
S0CMX Максимальная ёмкость первого выжившего (область выживания) в молодом поколении (байты)
S0C Ёмкость первого выжившего (область выживания) в молодом поколении (байты)
S1CMX Максимальная ёмкость второго выжившего (область выживания) в молодом поколении (байты)
S1C Ёмкость второго выжившего (область выживания) в молодом поколении (байты)
ECMX Максимальная ёмкость Eden (Эдемский сад) в молодом поколении (байты)
EC Ёмкость Eden (Эдемский сад) в молодом поколении (байты)
YGC Количество GC в молодом поколении от запуска приложения до выборки
FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
  1. jstat -gcold :Информация об объектах старого поколения.
    1
    2
    3
    4
    5
    6
    7
    8
    
    PC Ёмкость Perm (постоянное поколение) (байты)
    PU В настоящее время используемое пространство Perm (постоянное поколение) (байты)
    OC Ёмкость старого поколения (байты)
    OU В настоящее время используемое пространство старого поколения (байты)
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    FGCT Время, затраченное на GC в старом поколении (полный GC) от запуска приложения до выборки (с)
    GCT Общее время, затраченное на GC от запуска приложения до выборки (с)
    
  2. stat -gcoldcapacity : Информация об объектах старого поколения и их использовании.
    1
    2
    3
    4
    5
    6
    7
    8
    
    OGCMN Инициализированный (минимальный) размер в старом поколении (байты)
    OGCMX Максимальная ёмкость старого поколения (байты)
    OGC Текущая вновь сгенерированная ёмкость старого поколения (байты)
    OC Ёмкость старого поколения (байты)
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    FGCT Время, затраченное на GC в старом поколении (полный GC) от запуска приложения до выборки (с)
    GCT Общее время, затраченное на GC от запуска приложения до выборки (с)
    
  3. jstat -gcpermcapacity: Информация об объектах perm и их использовании.
    1
    2
    3
    4
    5
    6
    7
    8
    
    PGCMN Инициализированный (минимальный) размер в поколении perm (байты)
    PGCMX Максимальная ёмкость поколения perm (байты)
    PGC Текущая вновь сгенерированная ёмкость поколения perm (байты)
    PC Ёмкость Perm (постоянное поколение) (байты)
    YGC Количество GC в молодом поколении от запуска приложения до выборки
    FGC Количество GC в старом поколении (полный GC) от запуска приложения до выборки
    FGCT Время, затраченное на GC в старом поколении (полный GC) от запуска приложения до выборки (с)
    GCT Общее время, затраченное на GC от запуска приложения до выборки (с)
    
  4. jstat -printcompilation :Текущая информация о выполнении VM.
    1
    2
    3
    4
    
    Compiled Количество задач компиляции
    Size Размер байт-кода, сгенерированного методами
    Type Тип компиляции
    Method Имя класса и имя метода, используемые для идентификации скомпилированных методов. Имена классов используют / в качестве разделителя пространства имён. Имя метода — это метод в данном классе. Вышеуказанный формат устанавливается опцией -XX:+PrintComplation
    

MemoryAnalyzer

Ссылки

  1. Настройка JVM: Выбор подходящего сборщика GC (Три)
  2. Глубокое понимание сборщика мусора Java G1
  3. Стать экспертом JavaGC (1)—Механизм сборки мусора Java, глубокий и простой
  4. Стать экспертом JavaGC (2)—Как мониторить механизм сборки мусора Java
  5. Стать экспертом Java GC (3)—Как оптимизировать механизм сборки мусора Java
  6. Стать экспертом Java GC (4)—Подробное объяснение параметра MaxClients Apache и его влияние на выполнение FullGC в Tomcat
  7. Серия JVM Три: Настройка и анализ параметров JVM
  8. Введение в типы Java GC и замена/настройка GC
  9. Механизм сборки мусора Java (и как уменьшить вызовы GC и повысить производительность)
  10. What Is Garbage Collection?
  11. Анализ частого GC (Allocation Failure) и слишком длительного времени young gc
  12. Серия JVM Три: Настройка и анализ параметров JVM
  13. Настройка javaGC
  14. Некоторые ключевые технологии Java Hotspot G1 GC
  15. JVM
  16. Настройки памяти JVM (java виртуальная машина)
  17. Использование java jstat
  18. Подробное объяснение команды jstat
  19. Подробное объяснение использования jstat (Анализ использования JVM)
  20. Механизм загрузки классов java
  21. Использование G1(Garbage First)
  22. Серия обучения командам Java (4): Jstat
  23. Руководство по анализу и обработке проблем JVM
  24. Резюме настройки JVM -Xms -Xmx -Xmn -Xss


💬 讨论 / Discussion

对这篇文章有想法?欢迎在 GitHub 上发起讨论。
Have thoughts on this post? Start a discussion on GitHub.

在 GitHub 参与讨论 / Discuss on GitHub