1.设置堆内存的初始大小512m,设置堆内存最大大小2048m
java -Xms512m -Xmx2048m TestJVM
2.-XX参数
1)禁用手动GC操作
java -XX:+DisableExplicitGC TestJVM
2)设置老年代和新生代的比值
java -XX:NewRatio=1 TestJVM
3)运行java命令时打印参数
java -XX:+PrintFlagsFinal -XX:+VerifySharedSpaces -version
其中 = 和 :=分别代表默认值和被修改的值
4)打印垃圾回收的详细信息
-XX:+PrintGCDetails
5)使用串行、并行垃圾收集器
-XX:+UseSerialGC -XX:+UseParNewGC
6)使用灵活版并行垃圾收集器
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100
只使用-XX:+UseParallelGC:年轻代用并行的ParallelGC,老年代使用串行GC
带上-XX:+UseParallelOldGC:年轻代用Parallel并行GC,老年代使用并行的ParallelOldGC
-XX:MaxGCPauseMillis:设置最大垃圾回收停顿毫秒数
7)使用CMS并发垃圾收集器(针对老年代,使用标记清除算法)
-XX:+UseConcMarkSweepGC
8)使用G1垃圾收集器
-XX:+UseG1GC
设置期望达到的最大GC停顿指标
-XX:MaxGCPauseMillis
设置G1区域大小。默认为堆内存的1/2000
-XX:G1HeapRegionSize=n
设置STW工作线程的值。设置为逻辑处理器的数量,最多为8
-XX:ParallelGCThreads=n
当老年代大小占整个队大小百分比达到该阈值时触发Mixed GC。默认值45%
-XX:InitiatingHeapOccupancyPercent=n
3.查看java进程
jsp [-l]
4.查看java进程的所有参数
jinfo -flags <pid>
查看单一参数:
jinfo -flags MaxHeapSize 6219
5.jstat堆内存分析
1)查看class加载统计
jstat -class 6219
2)查看编译统计
jstat -compiler <pid>
3)垃圾回收统计
jstat -gc <pid> [间隔多少毫秒打印] [打印几次]
MC:方法区大小(KB)MU:方法区使用大小(KB)CCSC:压缩类空间大小(KB)CCSU:压缩类空间使用大小(KB)YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
6.jmap,更详细的jstat
1)查看内存使用情况
jmap -heap <pid>
2)查看活跃对象
jmap -histo:live <pid> | more
对象说明:B:byte C:char D:double F:float I:int J:long Z:boolean [:数组,如[I表示int[] [L+类名:其他对象
3)把内存使用情况dump到文件中
jmap -dump:format=b,file=/d/burp/dump.dat 15156
7.jhat分析dump下来的文件
1)启动服务
jhat -port <port> <file>
2)浏览器访问
3)OQL查询
8.jstack查看java线程运行情况
jstack <pid>
9.java代码优化建议
●尽量使用局部变量,方法内少用引用类型
●减少对变量的重复计算
for(int i=0; i<list.size(); i++){}
改为
int length = list.size(); for(int i=0; i<length; i++){}
●采用懒加载
●使用数据库连接池和线程池
●容器初始化时尽量指定长度
●用Entry遍历map
for(Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); }