多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 内存图 ![](../images/screenshot_1574871182818.png) # 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位操作系统的虚拟内存的可用性)。 2. 一个新的参数 (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%