- JVM参数
运行时数据区 | 参数名 | 含义 | 注释 |
---|---|---|---|
程序计数器 | |||
本地方法栈 | |||
Java虚拟机栈 | -Xss | 设置虚拟机栈大小 | |
堆 | -Xms | 堆的最小值 | |
堆 | -Xmx | 堆的最大值 | |
堆 | -Xmn | 新生代的大小 | |
堆 | -XX:NewSize | 新生代最小值 | |
堆 | -XX:MaxNewSize | 新生代最大值 | |
方法区 | -XX:PermSize | 方法区初始大小 | jdk<=1.7 |
方法区 | -XX:MaxPermSize | 方法区最大值 | jdk<=1.7 |
方法区 | -XX:MetaspaceSize | 元空间初始大小 | jdk>=1.8,受限于物理内存 |
方法区 | -XX:MaxMetaspaceSize | 元空间最大值 | jdk>=1.8,受限于物理内存 |
直接内存 | -XX:MaxDirectMemorySize | 直接内存大小 | 默认与堆内存大小一致 |
运行时常量池 | 位于方法区,jdk=1.6 | ||
运行时常量池 | 位于堆,jdk>=1.7 |
2. 代码重现栈上分配,代码和运行结果
public class StackAllocation {
class User {
private Integer id;
private String name;
}
private void test() {
User user = new User();
user.id = 1;
user.name = "name:" + 1;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
StackAllocation stackAllocation = new StackAllocation();
for (int i = 0; i < 100000000; i++) {
stackAllocation.test();
}
long end = System.currentTimeMillis();
System.out.println("时间总计;" + (end - start) + "ms");
}
}
使用栈上分配,配置Jvm参数为:-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations
运行结果为:
[GC (Allocation Failure) 2047K->720K(9728K), 0.0020939 secs]
[GC (Allocation Failure) 2768K->704K(9728K), 0.0017436 secs]
时间总计;14ms
不使用栈上分配,jvm参数为:-server -XMX10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations
[GC (Allocation Failure) 2037K->772K(9728K), 0.0010416 secs]
[GC (Allocation Failure) 2820K->804K(9728K), 0.0007706 secs]
......
[GC (Allocation Failure) 2884K->836K(9728K), 0.0002217 secs]
[GC (Allocation Failure) 2884K->836K(9728K), 0.0002279 secs]
时间总计;1867ms
- 代码重现堆溢出和栈溢出,代码和运行结果
public class OOM {
public void testHeap() {
for (int i = 0; i < 10000000; i++) {
byte[] bytes = new byte[1024 * 1024 * 1024];
}
}
private void testStack() {
testStack();
}
public static void main(String[] args) {
OOM oom = new OOM();
oom.testStack();
oom.testHeap();
}
}
堆溢出的运行结果:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OOM.testHeap(OOM.java:10)
at OOM.main(OOM.java:20)
栈溢出的运行结果:
Exception in thread "main" java.lang.StackOverflowError
at OOM.testStack(OOM.java:14)
at OOM.testStack(OOM.java:14)
......