JVM 内存区域大小参数设置

作者: jijs | 来源:发表于2017-05-07 11:50 被阅读1104次

    需要提前了解的知识点:

    1. JVM内存模型
    2. JVM垃圾回收算法

    下图是JVM内存区域划分的逻辑图

    JVM内存区域逻辑图

    从图中我们大概了解JVM相关的内存区域。

    JVM内存包括区域

    1. Heap(堆区)
    • New Generation(新生代)
      • Eden
      • Survivor From
      • Survivor To
    • Old Generation(老年代)
    1. 方法区
    • Permanent Generation(持久代)
    1. Stack(栈区)
    2. Metaspace(元空间)
    3. Direct ByteBuffer(直接内存)

    下面我们就通过一些JVM启动参数来配置以上内存空间

    Heap(堆)内存大小设置

    -Xms512m

    设置JVM堆初始内存为512M

    -Xmx1g

    设置JVM堆最大可用内存为1G

    New Generation(新生代)内存大小设置

    -Xmn256m

    设置JVM的新生代内存大小(-Xmn 是将NewSize与MaxNewSize设为一致。256m),同下面两个参数
    -XX:NewSize=256m
    -XX:MaxNewSize=256m

    还可以通过新生代和老年代内存的比值来设置新生代大小
    -XX:NewRatio=3

    设置新生代(包括Eden和两个Survivor区)与老年代的比值(除去持久代)。设置为3,则新生代与老年代所占比值为1:3,新生代占整个堆栈的1/4

    Survivor内存大小设置

    -XX:SurvivorRatio=8

    设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的1/10

    Eden内存大小设置

    新生代减去2*Survivor的内存大小就是Eden的大小。

    Old Generation(老年的)的内存大小设置

    堆内存减去新生代内存
    如上面设置的参数举例如下:
    老年代初始内存为:512M-256M=256M
    老年代最大内存为:1G-256M=768M

    Stack(栈)内存大小设置

    -Xss1m
    每个线程都会产生一个栈。在相同物理内存下,减小这个值能生成更多的线程。如果这个值太小会影响方法调用的深度。

    Permanent Generation(持久代)内存大小设置

    方法区内存分配(JDK8以前的版本使用,JDK8以后没有持久代了,使用的MetaSpace)
    -XX: PermSize=128m 设置持久代初始内存大小128M
    -XX:MaxPermSize=512m 设置持久代最大内存大小512M

    Metaspace(元空间)内存大小设置

    元空间(Metaspace)(JDK8)
    -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m(JDK8),JDK8的持久代几乎可用完机器的所有内存,同样设一个128M的初始值,512M的最大值保护一下。

    1. 默认情况下,类元数据分配受到可用的本机内存容量的限制(容量依然取决于你使用32位JVM还是64位操作系统的虚拟内存的可用性)。
    1. 一个新的参数 (MaxMetaspaceSize)可以使用。允许你来限制用于类元数据的本地内存。如果没有特别指定,元空间将会根据应用程序在运行时的需求动态设置大小。

    Direct ByteBuffer(直接内存)内存大小设置

    -XX:MaxDirectMemorySize

    此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。
    使用NIO可以api可以使用直接内存。

    设置新生代代对象进入老年代的年龄

    -XX:MaxTenuringThreshold=15

    设置垃圾最大年龄。如果设置为0的话,则新生代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象再新生代的存活时间,增加在新生代即被回收的概论。

    他最大值为15岁,因为对象头中用了4位进行存储垃圾年龄 【1111(二进制)=15(十进制)】。

    不常用的参数:

    -XX:MaxHeapFreeRatio=70

    GC后java堆中空闲量占的最大比例,大于该值,则堆内存会减少

    -XX:MinHeapFreeRatio=40

    GC后java堆中空闲量占的最小比例,小于该值,则堆内存会增加

    -XX:PretenureSizeThreshold=1024

    (单位字节)对象大小大于1024字节的直接在老年代分配对象

    -XX:TLABWasteTargetPercent =1

    TLAB占eden区的百分比 默认1%

    想了解更多精彩内容请关注我的公众号

    相关文章

      网友评论

      本文标题:JVM 内存区域大小参数设置

      本文链接:https://www.haomeiwen.com/subject/xsdutxtx.html