JVM内存结构详解

1、JVM内存结构

  • 程序计数器(Program Counter Register)

  • 虚拟机栈(Java Virtual Machine Stacks)

  • 本地方法栈(Native Method Stacks)

  • 堆(Java Heap)

    • 年轻代区域:堆的年轻代区域用于存放新生对象

      • Eden
      • From
      • To
  • 元空间(Metaspace)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPBtOLgc-1603510387859)(E:\Dict\qqCB3233BCCE0BD0752EE3094E3D9677C0\fd4cfcaab3bd41c8bbe192f07b0afd48\clipboard.png)]

2、JVM的内存调优主要针对的是堆和元空间

3、JVM要使用server模式

例: 
java -server -Xmx8G -Xms8G -Xmn3G -jar one-more-study-0.0.1-SNAPSHOT.jar

4、JVM参数

  • -server:JVMserver模式, 在多CPU服务器中性能可以得到更好地发挥。JDK的64位版本只支持server模式,因此在这种情况下,选项是隐式的。
  • -Xmx:所分配内存的最大值,等同于-XX:MaxHeapSize。
  • -Xms:所分配内存的初始值
  • **-Xmn:**指定堆的年轻代分配内存的初始值和最大值;建议把年轻代的大小保持在整个堆大小的1/21/4之间
  • **-XX:NewSize:**年轻代的初始值
  • **-XX:MaxNewSize:**年轻代的最大值
  • **-XX:NewRatio:**指定老年代和年轻代空间大小的比率,默认2,即老年代和年轻代空间大小的比率为2:1,年轻代占整个堆内存空间大小的1/3。
  • **-XX:SurvivorRatio:**指定Eden区和一个Survivor区的空间大小的比率。默认为8,即Eden区和一个Survivor区的空间大小为8:1,因为一共有两个Survivor区,所以Eden区占年轻代内存大小的80%。
  • **-XX:MetaspaceSize:**指定元空间第一次触发垃圾回收的内存大小的阈值。当元空间内存占用不断增大,直到达到这个阈值时,就会触发一次垃圾回收。所以,适当的增大这个阈值,会减少垃圾回收的次数。
  • **-XX:MaxMetaspaceSize:**指定元空间所分配内存的最大值,默认是没有限制,取决于系统的可用内存量,理论上可以占满整个系统的内存。为了避免这种惨剧,影响系统上的其他应用,需要适当设置它的大小。(512MB)
值大小: 
-Xmx1G 
或 
-Xmx1024M 
或 
-Xmx1048576K 
或 
-Xmx1073741824

设置示例:

java -server -Xmx8G -Xms8G -Xmn3G -XX:SurvivorRatio=4 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M -jar one-more-study-0.0.1-SNAPSHOT.jar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjevibaX-1603510387861)(E:\Dict\qqCB3233BCCE0BD0752EE3094E3D9677C0\9973059fa78943b7af42951e820e8809\clipboard.png)]

执行jmap -heap命令查看对应Java进程的内存配置和使用情况

Attaching to process ID 31828, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:   #堆的内存配置
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   # 堆内存的最大值
   MaxHeapSize       = 8589934592 (8192.0MB) 
   # 年轻代内存的大小
   NewSize           = 3221225472 (3072.0MB) 
   # 年轻代内存的最大值
   MaxNewSize        = 3221225472 (3072.0MB) 
   # 老年代内存的大小
   OldSize           = 5368709120 (5120.0MB) 
    # 老年代和年轻代空间大小的比率
    # 因为设置Xmn参数,该设置未生效
   NewRatio                 = 2
   #Eden区和一个Survivor区的空间大小的比率
   SurvivorRatio            = 4 
    # 元空间第一次触发垃圾回收的内存大小
   MetaspaceSize       = 268435456 (256.0MB)
    # 元空间内存的最大值
   MaxMetaspaceSize    = 536870912 (512.0MB)
   G1HeapRegionSize    = 0 (0.0MB)

Heap Usage: # 堆的使用情况
PS Young Generation
Eden Space: # Eden区内存的使用情况
   capacity = 2147483648 (2048.0MB)
   used     = 901945720 (860.16MB)
   free     = 1245537928 (1187.83MB)
   42.000120505690575% used
From Space: # Survivor的From区内存的使用情况
   capacity = 536870912 (512.0MB)
   used     = 0 (0.0MB)
   free     = 536870912 (512.0MB)
   0.0% used
To Space: # Survivor的To区内存的使用情况
   capacity = 536870912 (512.0MB)
   used     = 0 (0.0MB)
   free     = 536870912 (512.0MB)
   0.0% used
PS Old Generation # 老年代内存的使用情况
   capacity = 5368709120 (5120.0MB)
   used     = 0 (0.0MB)
   free     = 5368709120 (5120.0MB)
   0.0% used

12047 interned Strings occupying 1045744 bytes.
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页