当前位置: 首页 > news >正文

JVM专题之内存模型以及如何判定对象已死问题

体验与验证

2.4.5.1 使用visualvm

**visualgc插件下载链接 :https://visualvm.github.io/pluginscenters.html

https://visualvm.github.io/pluginscenters.html

**选择对应JDK版本链接--->Tools--->Visual GC**
 

2.4.5.2 堆内存溢出

* **代码**

java
@RestController
public class HeapController {
    List<Person> list=new ArrayList<Person>();
    @GetMapping("/heap")
    public String heap(){
        while(true){
            list.add(new Person());
        }
    }
}
```

记得设置参数比如-Xmx20M -Xms20M**

* **运行结果**

`访问`:http://localhost:8080/heap  http://localhost:8080/heap

```
Exception in thread "http-nio-8080-exec-2" java.lang.OutOfMemoryError: GC overhead limit exceeded
```

2.4.5.3 方法区内存溢出

> **比如向方法区中添加Class的信息**

* **asm依赖和Class代码**

```xml
<dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
</dependency>
```

```java
public class MyMetaspace extends ClassLoader {
    public static List<Class<?>> createClasses() {
        List<Class<?>> classes = new ArrayList<Class<?>>();
        for (int i = 0; i < 10000000; ++i) {
            ClassWriter cw = new ClassWriter(0);
            cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
                    "java/lang/Object", null);
            MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
                    "()V", null, null);
            mw.visitVarInsn(Opcodes.ALOAD, 0);
            mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
                    "<init>", "()V");
            mw.visitInsn(Opcodes.RETURN);
            mw.visitMaxs(1, 1);
            mw.visitEnd();
            Metaspace test = new Metaspace();
            byte[] code = cw.toByteArray();
            Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
            classes.add(exampleClass);
        }
        return classes;
    }
}
```

* **代码**

```java
@RestController
public class

http://www.lryc.cn/news/394191.html

相关文章:

  • vscode使用Git的常用操作
  • RPC与REST
  • 计数排序的实现
  • 【Qt】QTableWidget设置可以选择多行多列,并能复制选择的内容到剪贴板
  • 跨越界限的温柔坚守
  • Vue3 对于内嵌Iframe组件进行缓存
  • L04_MySQL知识图谱
  • 什么是CNN,它和传统机器学习有什么区别
  • 游戏开发面试题3
  • postman请求访问:认证失败,无法访问系统资源
  • Apache Seata新特性支持 -- undo_log压缩
  • Java中的软件架构重构与升级策略
  • 设置Docker中时区不生效的问题
  • LeetCode436:寻找右区间
  • 前端JS特效第22集:html5音乐旋律自定义交互特效
  • pyrender 离线渲染包安装教程
  • XSS平台的搭建
  • 【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】
  • PageHelper分页查询遇到的小问题
  • 【Python】组合数据类型:序列,列表,元组,字典,集合
  • algorithm算法库学习之——不修改序列的操作
  • idea创建的maven项目pom文件引入的坐标报红原因
  • Python面试题:Python 中的生成器(generator)是什么?有什么优点?
  • Go语言--复合类型之map、结构体
  • Stable Diffusion图像的脸部细节控制——采样器全解析
  • CurrentHashMap巧妙利用位运算获取数组指定下标元素
  • 实现antd designable平台的组件拖拽功能
  • 计算机网络-IP组播基础
  • Git删除了文件拉取时失败
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令