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

这里将借助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. Tools - Summary List

    通用 PicPick:https://picpick.app/zh/ Q-Dir:http://www.softwareok.com/?Download=Q-Dir 7-Zip:https://www ...

  2. 【嵌入式硬件Esp32】Ubuntu18.04 更换阿里云软件源

    使用Ubuntu 的apt-get来安装软件是总是因为官方源的速度太慢而抓狂. 但是用阿里云的源就很快,下面总结一下如何更换Ubuntu的软件源. 一.备份sudo cp /etc/apt/sourc ...

  3. EscaperWrapper 转义和反转义

    System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml4("<font>chen磊  x ...

  4. 超类Object

    Object:是类层次结构中的跟类,所有类都直接货间接继承自该类 如果一个方法的形参是Object,那么这里我们就可以传递它的任意的子类对象,相当于传任何数据类型都可以 toString()——返回地 ...

  5. idea设置项目【非springboot项目】热部署

    1.首先打开Edit Configurations 或者 2.添加的项目一定是war: exploded,而不是war 3.server这边,On 'Update' action选Redeploy,O ...

  6. 怎样ubuntu下命令行终端显示短路径

    参考:http://blog.sina.com.cn/s/blog_b71132f001016cmm.html ubuntu的终端命令行默认是长路径,即把路径深度全部显示出来,操作起来不是很方便,下面 ...

  7. Django使用指南

    一.安装Django 1.命令行安装 pip3 install django(默认安装最新稳定版本) pip3 install django==版本号(指定版本安装) 2.Pycharm安装 在Pyc ...

  8. 网页调试js时,如何知道某个事件对应哪段js代码?

    有时候我们需要知道某个事件对应的js代码,比如点击一个div元素时,出现下拉框,我想知道这个功能对应的js代码,那就可以按下图操作: 勾选click事件,重新运行,那么就会在每个click事件那里设置 ...

  9. zabbix 数据库分表操作

    近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...

  10. Presto个人常用操作

    时间戳转日期: from_unixtime(1569168000,'yyyy-MM-dd') = '2019-09-23' '20190903'转为'2019-09-23': unix_timesta ...