Jvm参数说明,栈上分配代码实现,堆溢出、栈溢出代码实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014653854/article/details/81394981
  1. 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
  1. 代码重现堆溢出和栈溢出,代码和运行结果
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)
    ......

猜你喜欢

转载自blog.csdn.net/u014653854/article/details/81394981