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

最新文章

  1. 理解Mac和iOS中的 Event 处理
  2. poj -2229 Sumsets (dp)
  3. cs108 java 02
  4. 使用Genymotion作Android开发模拟器:安装Genymotion、部署Genymotion Vitrue Device、安装Genymotion eclipse插件
  5. Android Studio 连接真机调试
  6. HDU1166 敌兵布阵(树状数组)
  7. 简述angular自定义过滤器在页面和控制器中的使用
  8. linux下将eclipse项目转换为gradle项目
  9. JS快速排序 希尔排序 归并排序 选择排序
  10. php:数组与json数据相互转换
  11. python中dict的fromkeys用法
  12. Shader基础(渲染管线)
  13. hdu 5441 Travel (2015长春网赛)
  14. 我的Java之旅——答答租车系统
  15. 【Python学习笔记】使用python进行kmeans聚类
  16. 理解面向消息中间件及JMS 以及 ActiveMQ例子
  17. .Net Core使用Redis-从安装到使用
  18. SQL注入工具sqlmap的注入过程记录
  19. 【Unity3D学习笔记】解决放大后场景消失不显示问题
  20. 配置Nginx来支持php

热门文章

  1. Go语言核心36讲53
  2. C温故补缺(三):存储类声明符(auto,register,extern,static)
  3. 写一个linux平台的桌面宠物
  4. 关于在linux测试启动盘命令(qemu的使用)
  5. 复现MySQL的索引选择失误以及通过OPTIMIZER_TRACE分析过程
  6. js拓展-Dom与事件,字符串,数组方法,object对象,作用域
  7. day33-JSON&amp;Ajax01
  8. 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
  9. Java-递归查询法
  10. Redis——02 学习