1.JAVA虚拟机堆内存溢出OutOfMemoryError
1.1设置参数
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 最小堆的大小20m 最大堆大小20m
1.2代码
public static void t1(){ List<Test> li = new ArrayList<>(); while (true){ li.add(new Test()); //不断的创建对象 } }
1.3执行结果
Java heap space:堆内存
java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid10972.hprof ... Heap dump file created [28518346 bytes in 0.143 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:265) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231) at java.util.ArrayList.add(ArrayList.java:462) at com.ruoyi.room.manager.web.controller.Test.main(Test.java:11)
2.JAVA虚拟机栈StackOverflowError
2.1设置参数
-Xss128k 每个线程的栈128k
2.2代码
public static void t2(){ t2(); //不断地调用方法,生成栈帧 }
2.3执行结果
Exception in thread "main" java.lang.StackOverflowError at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22) at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22) at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22)
3.字符串常量池
3.1设置参数
-XX:MetaspaceSize=18M -XX:MaxMetaspaceSize=18M 元空间大小18m 最大18m
3.2代码
public static void t3(){ Set<String> s = new HashSet<>(); int i = 0; while (true){ s.add(String.valueOf(++i).intern()); //不断地创建字符串 } }
3.3执行
发现一直可以执行,说明字符串常量池不在元空间中
3.4再次设置
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 最小堆的大小20m 最大堆大小20m
3.5执行
Java heap space :堆内存,说明字符串常量池在堆内存中
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.resize(HashMap.java:704) at java.util.HashMap.putVal(HashMap.java:663) at java.util.HashMap.put(HashMap.java:612) at java.util.HashSet.add(HashSet.java:220) at com.ruoyi.room.manager.web.controller.Test.t3(Test.java:28) at com.ruoyi.room.manager.web.controller.Test.main(Test.java:9) Disconnected from the target VM, address: '127.0.0.1:8574', transport: 'socket' Process finished with exit code 1
3.6测试
String str1=new StringBuilder("计算机").append("软件").toString(); System.out.println(str1==str1.intern()); String str2=new StringBuilder("ja").append("va").toString(); System.out.println(str2==str2.intern());
这段代码在JDK1.6中运行,会得到两个 false,而在JDK1.7中运行,会得到一个true和一个 false。
在JDK1.6中, intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用,而由 StringBuilder创建的字符串实例在Java堆上,所以必然不是同一个引用,将返回 false。
JDK1.7及以上(以及部分其他虚拟机,例如 JRockit)的 intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用,因此 intern()返回的引用和由 StringBuilder刨建的那个字符串实例是同一个。对st2比较返回 false是因为“java”这个字符串在执行 StringBuilder.toString()之前已经出现过,字符串常量池中已经有它的引用了,不符合“首次出现”的原则,而“计算机软件”这个字符串则是首次出现的,因此返回true。
4.元空间(方法区)内存溢出
4.1参数设置
-XX:MetaspaceSize=18M -XX:MaxMetaspaceSize=18M 元空间大小18M 最大18M
4.2代码
public static void t4(){ while (true){ //不断的创建动态类 Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(LjCollection.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o,objects); } }); enhancer.create(); }
4.3执行
Metaspace:元空间
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:538) at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363) at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131) at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572) at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:387) at com.ruoyi.room.manager.web.controller.Test.t4(Test.java:53) at com.ruoyi.room.manager.web.controller.Test.main(Test.java:14) Disconnected from the target VM, address: '127.0.0.1:9746', transport: 'socket' Process finished with exit code 1
参考https://blog.csdn.net/shenchaohao12321/article/details/96163164