jvm精进之路-jvm参数学习笔记

Dcr 1年前 ⋅ 936 阅读

JVM参数通常设置的位置 我们启动一个java程序很简单,命令类似如下 java Main

我们都知道上面的Main是程序的启动类,JVM执行的时候会找到这个Main类里的如下签名的函数 Public static void main(String args[])

那这里函数的参数args怎么传进来的呢?我们通过在启动命令的主类后面加上相关的参数,参数之间用空格分开,JVM会自动将这些参数作为args的组成部分传进来,比如 java Main arg1 arg2

这样,args这个数组里自动会填充arg1和arg2两个元素,这样在你的程序里就可以使用这些参数了

我们把arg1和arg2这些叫做程序参数,但是和我们课程相关的并不是程序参数,而是JVM参数,那JVM参数放到哪里呢?JVM参数都是放在主类之前,java命令之后,比如 java -Xmx100M Main arg1 arg2

这里的-Xmx100M其实就是JVM参数,所以所有的JVM参数都是放在这个位置的,如果不是这个位置,那你设置的JVM参数将会是无效的,如果参数出现不符合预期的情况,那请第一时间检查的是你JVM参数设置的位置,当然还可能存在一些别的原因导致JVM参数和你设置的情况可能不一致的情况

JVM参数的写法 JVM参数写法有好几种 "-X"开头,比如-Xmx "-XX"开头,比如-XX:UseG1GC "-"开头,比如:-verbose:gc 其中-x和-开头的通常会被转换为一个或多个-xx:开头的参数,只是一个简化的写法,比如说-Xmx100M,JVM里会自动转化为-XX:MaxHeapSize=100M,-verbose:class会自动转换为-XX:+TraceClassLoading -XX:+TraceClassUnloading

-Xmx5000m 最大堆大小

-Xms5000m 初始化堆大小

-Xmn2000m 年轻代大小

-XX:PermSize=256m 初始化持久代大小

-verbose:gc 报告每次垃圾收集时的基本GC信息。

-XX:+PrintGCDateStamps 输出gc的触发时间

-XX:+PrintGCTimeStamps 在每次垃圾收集时打印时间戳,指示自JVM启动以来的流逝时间。可以输出垃圾收集发生时的时间信息。

-XX:+PrintGCDetails 开启新生代、老年代和永久代垃圾收集统计信息的详细报告。

-XX:+PrintTenuringDistribution 输出显示在survivor空间里面有效的对象的岁数情况

-XX:+PrintCommandLineFlags 这个参数让 JVM 打印出那些已经被用户或者 JVM 设置过的详细的 XX 参数的名称和值。 并且输出到日志文件上

-XX:+DisableExplicitGC 加了這個參數會停止掉WLS或是程式內直接呼叫GC,減少不必要的GC,將GC交由JVM去執行

-XX:ParallelCMSThreads=2 控制多线程垃圾收集器垃圾收集线程的并行数, 建议显式设置垃圾收集线程的并行数,该数应该小于HotSpot VM的默认值。运行在一个系统上的垃圾收集线程,总数不应该超过Runtime.availableProcessors()。

-XX:+UseConcMarkSweepGC 开启HotSpot VM的CMS收集器。它会自动开启-XX:+UseParNewGC,新生代使用多线程垃圾收集器,老年代使用CMS收集器。

-XX:+CMSClassUnloadingEnabled 由于使用的框架是Spring/Hibernate大量采用cglib,导致生成的Proxy会比较多,而这些是存放在PermGen区域,sun JDK默认情况下不会去回收,必须加上- XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled参数,JDK才会去回收这部分数据

-XX:+UseCMSCompactAtFullCollection 打开对年老代的压缩。可能会影响性能,但是可以消除碎片(老年代才会有full gc)

-XX:CMSInitiatingOccupancyFraction=80 CMS堆上,使用80%后开始CMS收集

-Xloggc:/data/log/cbook/gc.log gc日志输出路径

全部评论: 0

    我有话说: