1、堆设置
- -Xms:堆内存的最小值
- -Xmx:堆内存的最大值
- -Xmn:堆内存中新生代的初始化大小
-
-XX:newSize:表示堆内存中新生代初始化的最小值,应该小于-Xms的值; -XX:MaxnewSize:表示堆内存中新生代初始化的最大值;当然这个值应该小于-Xmx的值; -Xmn:至于这个参数则是相当于对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的
- -XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
- -XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为8,表示Eden:Survivor=8:2,一个Survivor区占整个新生代的1/8
- -XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
栈设置
- -Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
方法区
- -XX:PermSize:表示非堆区(方法区)初始内存分配的最小值
- -XX:MaxPermSize:表示对非堆区(方法区)分配的内存的最大值
- -XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后,以前叫做持久代并且占用内存在堆里,1.8之后在方法区中)
2、收集器设置
- -XX:+UseSerialGC:设置串行收集器
- -XX:+UseParallelGC:设置并行收集器
- -XX:+UseParalledlOldGC:设置并行老年代收集器
- -XX:+UseConcMarkSweepGC:设置并发收集器
3、垃圾回收统计信息
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -Xloggc:filename
4、并行收集器设置
- -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
- -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
- -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
5、并发收集器设置
- -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
- -XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
1、liunx上使用命令查看jvm各项参数
- jps (JVM Process Status): 类似 UNIX 的 ps 命令。查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
- 用法:
- jps -q :只输出进程的本地虚拟机唯一 ID
- jps -l 输出主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径。
- jps -v:输出虚拟机进程启动时 JVM 参数。(经常使用,类似ps - ef |grep java 但比这个显示更清晰)
- jps -m:输出传递给 Java 进程 main() 函数的参数。
- .jstat命令:jstat 它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
- jstat -class vmid :显示 ClassLoader 的相关信息;
- jstat -compiler vmid :显示 JIT 编译的相关信息;
- jstat -gc vmid :显示与 GC 相关的堆信息;
- jstat -gccapacity vmid :显示各个代的容量及使用情况;
- jstat -gcnew vmid :显示新生代信息;
- jstat -gcnewcapcacity vmid :显示新生代大小与使用情况;
- jstat -gcold vmid :显示老年代和永久代的信息;
- jstat -gcoldcapacity vmid :显示老年代的大小;
- jstat -gcpermcapacity vmid :显示永久代大小;
- jstat -gcutil vmid :显示垃圾收集信息;
- 另外,加上 -t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间。
- 比如 jstat -gc -h3 31736 1000 10表示分析进程 id 为 31736 的 gc 情况,每隔 1000ms 打印一次记录,打印 10 次停止,每 3 行后打印指标头部。
- jstack主要用来查看某个Java进程内的线程堆栈信息,jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码。
- 1、首先使用jps找到需要查看的进程pid
- 2、接着找出该进程最消耗CPU的线程,可以使用top -Hp 26048或者ps -Lfp 26048来查看该进程中线程的cpu消耗情况
- 3、查看到线程26094的消耗CPU时间是最长的,用命令查看该线程的十六进制值
-
[root@dzt-test-5-52 promotion-core]# printf "%x\n" 26094 65ee 查询到的值65ee用于下面jstack 定位信息(jstack 进程号|grep 65ee) [root@dzt-test-5-52 promotion-core]# jstack 26048|grep 65ee "redisson-netty-4-5" #34 prio=5 os_prio=0 tid=0x00007fa3462cd000 nid=0x65ee runnable [0x00007fa2e4bd7000] 这样就可以看到redisson-netty-4-5是最耗时的类,然后就可以去代码审查代码了。
-
工具使用有jdk自带的监控和管理控制台JConsole和java VisualVM(安装插件)这个也挺好用的