介绍常用的参数,可能介绍的顺序有点乱
1.栈上分配有一个逃逸分析,只有在server模式下才可以启动逃逸分析,参数:
-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+EliminateAllocations
-server:在server模式下
-Xmx:配置堆的最大内存
-Xms:配置堆的最小内存
-XX:+DoEscapeAnalysis:开启逃逸分析
-XX:PrintGCDetails:遇到GC打印日志
-XX:+EliminateAllocations:开启标量替换(允许将对象打撒在分配的栈上)
例子代码:https://github.com/Ericjeff/JVM/blob/master/Function.java
[Times:user=0.00 sys=0.00 real=0.00 secs]
user:用户态cpu耗时,sys:系统cpu耗时,real:gc实际经历的时间
-XX:+PrintHeapAtGC:在每次GC前后打印堆的信息
-XX:+PrintGCApplicationConcurrentTime:打印应用程序的执行时间
-XX:+PrintReferenceGC:跟踪软引用,弱引用,虚引用和Finallize队列
-XX:+PrintVMOptions:打印显示参数
-XX:PrintCommandLineFlags:打印传给虚拟机的显示和隐式参数
-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps:日期时间
新生代配置:
新生代一般大小为整个堆的1/3到1/4之间
-XX:SurvivorRatio=eden/from=eden/to
设置eden和from/to的内存空间的比例
如-XX:SurvivorRatio=2 eden为from/to的两倍
-Xmn:设置新生代的大小
-XX:NewRatio=老年代/新生代
堆溢出:
例子路径:https://github.com/Ericjeff/JVM/blob/master/Dump.java
-XX:+HeapDumpOnOutOfMemoryError:在内存溢出时导出这个对信息
-XX:HeapDumpPath:导出的路径
如:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=H:/a.dump
使用MAT查看(memory analyser)需要有eclipse,因为它是基于eclipse的插件
内存配置:
方法区:
1.6,1.7 : -XX:PermSize 初始大小,-XX:MaxPermSize 最大内存
1.8 永久区被移除,使用新的元数据区存放类的元数据,-XX:MetaspaceSize -XX:MaxMetaspaceSize
栈:
-Xss指定大小 如-Xss10m 指定为10m
直接内存:
默认和堆一样大(-Xmx)
-XX:MaxDirectMemorySize
直接内存:https://github.com/Ericjeff/JVM/blob/master/AccessDirectBuffer.java
虚
虚拟机运行模式:
支持client和server模式
使用java -version查看当前模式
server与client相比,server模式启动慢,因为server模式会尝试收集更多关于系统的信息,使用更复杂的优化算法进行程序优化,当系统进入运行稳定时期,会比client模式更快