JVM
1.设置堆内存大小和 OOM
-Xms 用来表示堆的起始内存,等价于 -XX:InitialHeapSize
-Xmx 用来表示堆的最大内存,等价于 -XX:MaxHeapSize
如果堆的内存大小超过 -Xmx 设定的最大内存, 就会抛出 OutOfMemoryError 异常。
我们通常会将 -Xmx 和 -Xms 两个参数配置为相同的值,其目的是为了能够在垃圾回收机制清理完堆区后不再需要重新分隔计算堆的大小,从而提高性能。
2.新生代和老年代
默认情况下新生代和老年代的比例是 1:2,可以通过
`–XX:NewRatio` 来配置。
新生代中的 Eden:From Survivor:To Survivor 的比例是8:1:1,可以通过 `-XX:SurvivorRatio` 来配置。
若在 JDK 7 中开启了 `-XX:+UseAdaptiveSizePolicy`,JVM 会动态调整 JVM 堆中各个区域的大小以及进入老年代的年龄。
此时 `–XX:NewRatio` 和 `-XX:SurvivorRatio` 将会失效,而 JDK 8 是默认开启`-XX:+UseAdaptiveSizePolicy`。
在 JDK 8中,不要随意关闭 `-XX:+UseAdaptiveSizePolicy`,除非对堆内存的划分有明确的规划,每次 GC 后都会重新计算 Eden、From Survivor、To Survivor 的大小。
计算依据是GC过程中统计的GC时间、吞吐量、内存占用量
java -XX:+PrintFlagsFinal -version | grep HeapSize
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 134217728 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2147483648 {product}
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
$ jmap -heap 进程号
3. TLAB 空间
尽管不是所有的对象实例都能够在 TLAB 中成功分配内存,但 JVM 确实是将 TLAB 作为内存分配的首选。
在程序中,可以通过 -XX:UseTLAB
设置是否开启 TLAB 空间。
默认情况下,TLAB 空间的内存非常小,仅占有整个 Eden 空间的 1%,我们可以通过 -XX:TLABWasteTargetPercent
设置 TLAB 空间所占用 Eden 空间的百分比大小。
一旦对象在 TLAB 空间分配内存失败时,JVM 就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在 Eden 空间中分配内存。