一、Java 内存管理之类似 - Xms、-Xmx 这些参数的含义
答:
- 堆内存分配:
-
-Xms JVM 初始分配的内存由 -Xms 指定,默认是物理内存的 1/64;
-
-Xmx JVM 最大分配的内存由 -Xmx 指定,默认是物理内存的 1/4;
默认空余堆内存小于 40% 时,JVM 就会增大堆直到 - Xmx 的最大限制;空余堆内存大于 70% 时,JVM 会减少堆直到 -Xms 的最小限制;
因此服务器一般设置 - Xms、-Xmx 相等以避免在每次 GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。 -
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx 减去 - Xmn
-
-Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
- 对于具体含义的猜测: ⭐️⭐️⭐️
-
-Xms:minimum memory size for pile and heap
-
-Xmx:maximum memory size for pile and heap
-
eXtendable 我觉得 X 指的就是可扩展的意思,因为堆内存可动态扩展。
-
-Xms
,eXtendable memory size 表示初始
memory size(m 表示 memory,s 表示 size)。初始暗含最小(minimum)的意思。(常用的做法中初始内存采用的也就是最小内存) -
-Xmx
,不压缩表示应该是-Xmsx
: eXtendable memory maximum size ,x
采用计算机中约定表示方式: 用x
表示 “大”。为了对齐三字符,压缩了其表示形式,把最后一个s
省略了。
- 非堆内存分配:
- JVM 使用 -XX:PermSize 设置非堆内存初始值,默认是物理内存的 1/64;
- 由 XX:MaxPermSize 设置最大非堆内存的大小,默认是物理内存的 1/4;
- -Xmn2G:设置年轻代大小为 2G;
- -XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意 Survivor 区有两个。
如: -XX:SurvivorRatio=3,表示 Eden : Survivor=3 : 2,一个 Survivor 区占整个新生代的1/5
二、JVM 其他参数常用参数
JVM 有非常多的配置,常用的如下:
- 堆设置
- -Xms: 初始堆大小
- -Xmx: 最大堆大小
- -Xmn: 新生代大小
- -XX:NewRatio: 设置新生代和老年代的比值。如:为 3,表示年轻代与老年代比值为 1:3
- -XX:SurvivorRatio: 新生代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。如:为 3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个新生代的 1/5
- -XX:MaxTenuringThreshold: 设置转入老年代的存活次数。如果是 0,则直接跳过新生代进入老年代
- -XX:PermSize、-XX:MaxPermSize: 分别设置永久代最小大小与最大大小(Java8 以前)
- -XX:MetaspaceSize、-XX:MaxMetaspaceSize: 分别设置元空间最小大小与最大大小(Java8 以后)
- 收集器设置
- -XX:+UseSerialGC: 设置串行收集器
- -XX:+UseParallelGC: 设置并行收集器
- -XX:+UseParalledlOldGC: 设置并行老年代收集器
- -XX:+UseConcMarkSweepGC: 设置并发收集器
- 垃圾回收统计信息
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -Xloggc:filename
- 并行收集器设置
- -XX:ParallelGCThreads=n: 设置并行收集器收集时使用的 CPU 数。并行收集线程数。
- -XX:MaxGCPauseMillis=n: 设置并行收集最大暂停时间
- -XX:GCTimeRatio=n: 设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n)
- 并发收集器设置
- -XX:+CMSIncrementalMode: 设置为增量模式。适用于单 CPU 情况。
- -XX:ParallelGCThreads=n: 设置并发收集器新生代收集方式为并行收集时,使用的 CPU 数。并行收集线程数。