JVM调优文档
程序1
package com.cxl.demo;
public class T1 {
class User{
int id;
String name;
User(int id,String name){
this.id = id;
this.name = name;
}
}
void alloc(int i){
new User(i,"name"+i);
}
public static void main(String[] args) {
T1 t = new T1();
long s1 = System.currentTimeMillis();
for(int i = 0;i<100000000;i++) t.alloc(i);
long s2 = System.currentTimeMillis();
System.out.println(s2 - s1);
}
}
-XX:+PrintGC #打印GC
-XX:-UseTLAB #使用线程本地缓存
-XX:+DoEscapeAnalysis #使用逃逸分析
-XX:+EliminateAllocations #关闭标量替换
程序2
package com.cxl.demo;
public class T2 {
public static void main(String[] args) {
byte[] b = new byte[1024];
}
}
-XX:+PrintGCDetails #打印GC详情信息
-XX:-UseTLAB #使用线程本地缓存
-XX:+DoEscapeAnalysis #使用逃逸分析
-XX:+EliminateAllocations #关闭标量替换
程序3
package com.cxl.demo;
/**
* 可以用Runtime类“大致”计算内存情况
*/
public class T3 {
public static void main(String[] args) {
printMemoryInfo();
byte[] b = new byte[1024*1024];
System.out.println("--------------");
printMemoryInfo();
}
static void printMemoryInfo(){
System.out.println("total: " + Runtime.getRuntime().totalMemory());//总共内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("free: " + Runtime.getRuntime().freeMemory());//剩余内存
long free = Runtime.getRuntime().freeMemory();
String curr = String.valueOf(total-free);
System.out.println("curr: " + curr);
}
}
直接跑起来,使用了java自带的,只能是个参考数值
程序4
package com.cxl.demo;
import java.util.ArrayList;
import java.util.List;
/**
* 内存溢出
* -XX:+HeapDumpOnOutOfMemoryError #内存消耗完了,把堆的信息给(倒入)下载下来
* -XX:HeapDumpPath=c:\jvm.dump #内存溢出堆信息倒入到该路径的文件
* -XX:+PrintGCDetails #打印GC详情信息
* -Xms10M #JVM程序起始的堆内存空间
* -Xmx10M #JVM最大的堆内存空间 调优一般起始值和最大值一样,效率最高
*/
public class T4 {
public static void main(String[] args) {
List<Object> lists = new ArrayList<Object>();
for(int i = 0;i<1000000000;i++) lists.add(new byte[1024*1024]);
}
}
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=f:\jvm.dump
-XX:+PrintGCDetails
-Xms10M
-Xmx10M
程序5
package com.cxl.demo;
/**
* 递归调用,一直递归调用,调用栈针,总有一天内存会满
* Xss128
* 越小,并发越大
* 越大,线程递归调用比较深
*/
public class T5 {
static int count = 0;
static void r(){
count ++;
r();
}
public static void main(String[] args){
try{
r();
}catch(Throwable t){
System.out.println(count);
t.printStackTrace();
}
}
}
-Xss512k
JVM常用参数
堆设置
–Xms 初始堆大小
-Xmx 最大堆大小
-Xss 线程栈大小
-XX:NewSize=n 设置年轻代大小
-XX:NewRatio=n 设置年轻代和老年代的比值
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值,注意Survivor区有两个
-XX:MaxPermSize=n 设置持久代大小
收集器设置
-XX:+UseSerialGC 设置串行收集器
-XX:+UseParallelGC 设置并行收集器
-XX:+UseConcMarkSweepGC 设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-Xloggc:filename