回顾一下上一次对于这次做的实验的一个背景说明:

这里将借助cglib这个库来完成动态类的创建,为啥要使用它?因为使用简单,二是在程序运行期可以动态的生成类,动态生成类之后生成类的元数据就会落入到元空间当中,这样我们就可以不断来增加类的生成从而来增加元空间元数据的增加,另外在上一次说过元空间默认的大小是21MB:

为了能尽快模拟出方法区溢出,我们需要来修改一下JVM的参数来修改元空间的大小并限制它不可以进行内容扩展,首先咱们来在build.gradle中添加cglib的依赖:

好,接下来则无限期的来创建Class,不过这里再来扩展一个小知识,对于Spring的aop就是使用cglib来实现的,而为啥不使用动态代理呢?因为动态代理很大一个限制就是只能对实现了指定接口的类来实现动态代理,所以这就是为啥要用cglib的原因,它可以生成目类的子类,然后再覆盖父类的方法并在方法执行前和执行后增加我们想要的代码,好下面来瞅下cglib如何来生成class:

具体如何用的这里不是重点,只知道上面的代码是使用cglib动态来创建类了就成了,接下来在运行之前我们得来改一下元空间的大小,具体如下:

然后运行:

再来看一下异常:

注意:如果在JDK1.8之前的会提示永久代溢出了。

程序模拟出来了,但到底内部是个代码情况呢,此时就又得借助工具来瞅一下啦,由于目前执行速度过快程序就报元空间异常了,所以咱们将元空间的大小调大,这样程序就可以多运行会来用工具查看:

运行程序,然后这里用jconsole来监测一下:

接着我们再来看一下其它视图的信息:

看到效果么,也就是如果勾选了详细输出选项之后我们在输出时会看到具体加载类的信息,如下:

其实就是给JVM增加了一个之前我们使用过的TraceClassLoading参数,如下:

这里就不运行了,貌似通过jconsole也木有看到元空间相关的状态信息,咱们换jvisualvm来试一下:

清晰的可以对元空间的走势看得一清二楚,也确实是比jconsole工具要强大,另外从监视中可以发现刚好是超过200MB的时候程序就报溢出了,也就是如我们设置的最大上限所预期的。

另外对于元空间是啥,这里推荐一篇infoq的文章【https://www.infoq.cn/article/Java-PERMGEN-Removed】,详细对元空间的来龙去脉进行了详述,可以好好瞅瞅。下面针对这篇文章的重点过一遍:

另外该文章还介绍了一些查看工具,如下:

关于这几个工具在接下来会来实践一下滴~~

JVM元空间深度解析的更多相关文章

  1. JVM内存区域解析

    引言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的 ...

  2. JVM 类加载器命名空间深度解析与实例分析

    一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...

  3. JVM 完整深入解析

    工作之余,想总结一下JVM相关知识.以下内容都是针对于jdk1.7的. Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途 ...

  4. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  5. JVM(五)手动解析.class文件

    一:不同进制之间的转换 二进制:逢2进1,数字0-1. 八进制:逢8进1,数字0-7.三位二进制表示一位八进制.三位二进制最大为111,最大为7. 十进制:逢10进1,数字0-9.四位二进制表示一位十 ...

  6. JVM系列(三):JVM创建过程解析

    上两篇中梳理了整个java启动过程中,jvm大致是如何运行的.即厘清了我们认为的jvm的启动过程.但那里面仅为一些大致的东西,比如参数解析,验证,dll加载等等.把最核心的loadJavaVM()交给 ...

  7. JVM元空间(Metaspace)

    本文转载自JVM学习--元空间(Metaspace) 从方法区(PermGen)到元空间(Metaspace) 方法区(PermGen) JDK1.8以前的HotSpot JVM有方法区,也叫永久代( ...

  8. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  9. 【JVM】jvm虚拟机参数解析

    转载:https://blog.csdn.net/see__you__again/article/details/51998038不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正 ...

随机推荐

  1. python解包

    概念 python的解包可以这样来理解:把元素给拆分并把其赋值给自己所需要的变量,因此元素应该是一个可迭代对象. 形式 简单版本 下面展示的是解包的基本形式,根据长度赋值给对应多的变量. name_l ...

  2. pytorch1.0批训练神经网络

    pytorch1.0批训练神经网络 import torch import torch.utils.data as Data # Torch 中提供了一种帮助整理数据结构的工具, 叫做 DataLoa ...

  3. [转帖]JVM—深入理解内存模型与垃圾收集机制

    JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...

  4. Prometheus入门到放弃(1)之Prometheus安装部署

    规划: IP 角色 版本 10.10.0.13 prometheus-server 2.10 10.10.0.11 node_exporter 0.18.1 10.10.0.12 node_expor ...

  5. cesium 水面、淹没 效果

    水面效果 参考: http://cesiumcn.org/topic/158.html http://api.rivermap.cn/cesium/rivermap/map.html https:// ...

  6. java并发知识点

    前言 先列出java并发涉及的知识点,后面再慢慢补. java并发 1 常见概念 进程/线程 进程:程序执行的实体,操作系统资源调度资源分配的基本单元 线程:程序执行的最小单元,拥有独立的堆栈和局部变 ...

  7. 初始NLTK

    NLTK官网:链接 Natural Language Toolkit NLTK corpora and lexical resources such as WordNet, along with a ...

  8. python3快速安装升级pip3

    一.下载地址: 获取get-pip.py安装文件: 官网链接:https://bootstrap.pypa.io/get-pip.py 百度云链接:https://pan.baidu.com/s/14 ...

  9. mac oxs 上查看进程监听的端口号 lsof

    sudo netstat -ltnp |grep xxx lsof -p 26917 | grep LISTEN https://mengkang.net/1090.html

  10. Shiro授权及注解式开发

    目的: shiro授权 shiro注解式开发 Shiro授权 首先设计shiro权限表: 从图中我们也清晰的看出五张表之间的关系 ShiroUserMapper Set<String> g ...