官方参数文档
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
栈
-Xss128K,设置jvm中栈的大小(每个线程私有的空间)
堆
-Xms20m,设置堆的初始化大小(-XX:InitialHeapSize)
-X,jvm的运行参数;ms,memory size
默认堆初始化大小是电脑物理内存大小的1/64
cmd命令查看堆内存使用情况
jps,查看运行的进程号
jstat -gc 进程id
参数查看堆内存使用情况
-XX:+PrintGCDetails
-XX:+PrintFlagsInitial,查看所有的参数的默认初始值
-XX:+PrintFlagsFinal,查看所有的参数的最终值(可能会存在修改,不再是初始值)
-Xmx64m,设置堆的最大大小(-XX:MaxHeapSize)
默认堆的最大大小是电脑物理内存的1/4
如果设置堆的初始大小与最大大小相同,则在jvm运行期间堆不会再进行扩展
开发中建议将堆的初始大小与最大大小设置为相同,避免jvm在运行中进行扩容,造成系统资源的占用
-XX:NewRatio=2,设置老年代与新生代的比例
老年代与新生代的默认值比例是2:1
cmd命令查看参数
jps 查看进程号
jinfo -flag NewRatio/SurvivorRatio 进程id
-Xmn50m,设置新生代的空间大小,当设置新生代与老年代的比例,并设置有该参数时,则以该参数为准
-XX:SurvivorRatio=8,设置伊甸园区与幸存者区的比例
默认伊甸园与幸存者区的比例是8:1:1,但可能会有一定的波动范围
存在自适应机制:-XX:-UseAdaptiveSizePolicy,关闭自适应内存分配策略,但是不会起作用
想要比例是8:1:1,要显示的在参数中进行设置
-XX:MaxTenuringThreshold=15,设置对象进入老年代的阈值
系统默认的阈值是15,达到该阈值的对象将晋升到老年代中
某些特大的对象新生代无法存放,也会直接在老年代进行分配
YGC/Minor GC只在Eden空间满的时候触发,幸存区满的时候不会触发GC,YGC发生时会顺便进行幸存区的清理
频繁收集新生代,较少收集老年代,几乎不动永久代/元空间
-XX:HandlePromotionFailure=true,设置空间分配担保
在jdk7开始,该参数由系统进行管理,直接默认是true,不受我们外界管理设置
-XX:+UseTLAB,设置为每个线程分配独立的运行内存区域
该空间分配在Eden内,占Eden空间的1%,系统默认是开启使用该分配策略的
-XX:+DoEscapeAnalysis,使用逃逸分析分配对象
栈上分配:一个对象经过逃逸分析后,没有发生逃逸(只在方法内部进行使用),则该对象可以在栈上进行分配
好处:不用进行垃圾收集处理,节省堆内空间,分配速度较快
在jdk7以及之后,系统默认是开启使用逃逸分析的
-XX:+HeapDumpOnOutOfMemoryError 程序运行中当堆空间发生OOM时会生成dump文件
-XX:+PrintCommandLineFlags 查看命令行相关的参数(包含垃圾回收器)<br>
方法区(永久代/元空间)
-XX:PermSize=20.75m,设置永久代初始化大小(jdk7系统默认是20.75M)<br>
-XX:MaxPermSize=82m,设置永久代最大使用空间大小(jdk7系统默认是82M)<br>
-XX:MetaspaceSize,设置元空间的初始化大小(jdk8系统默认是20.79M)<br>
-XX:MaxMetaspaceSize,设置元空间的最大使用空间大小(jdk8中元空间分配在本地内存,所以由系统的内存来决定)<br>