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

这里将借助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. Error:(18, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)

    问题:主要是因为jdk版本不一样 解决: 方法一:List<String> list=new ArrayList<Stirng>(); 方法二:重新安装jdk8的版本(安装和配 ...

  2. 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告

    题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...

  3. Appium移动自动化测试-----(六)2.AppiumDesktop录制脚本生成极简脚本

    AppiumDesktop启动页面: 启动AppiumDesktop以后点击该页面右上角的Start New Session按钮,就会启动一个新的会话窗口(如下图),在这个窗口我们需要配置一些Desi ...

  4. mysql数据库表的查询

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  5. 自己实现CountDownLatch

    自己实现的CountDownLatch ,只是模拟他的功能而已.jdk中的实现采用的是AQS public class MyCountDownLatch { private final int tot ...

  6. Windows10下Anaconda+Tensorflow+Keras环境配置

    注意!注意!!注意!!! (重要的事情说三遍) 安装前检查: 1.Tensorflow不支持Anaconda2,Tensorflow也不支持python2.7和python3.7(满满的辛酸泪!) 2 ...

  7. python内置模块介绍(一)

     本文主要介绍模块列表如下: os sys re time datetime random shutil subprocess os模块 os.getcwd()                    ...

  8. 1181: 零起点学算法88——偶数求和(C语言)

    一.题目: 题目来源WUSTOJ 二.源代码: #include<stdio.h> int main() { int n, m, num, sum, i, j, k; while (sca ...

  9. 网络地址转换(NAT)

    NAT是解决ipv4地址短缺的方案之一 NAT是将位于子网中的主机与外网连通,子网中所有的主机都可以通过路由器的网络地址转换访问外网.对于外网来说该路由器相当于一台完整的主机,子网内所有主机对外网的访 ...

  10. CH01-ZYNQ修炼秘籍-LINUX篇-虚拟机环境搭建

    CH01基于Ubuntu系统的ZYNQ-7000开发环境的搭建 1.1概述 实验环境: Windows 10 专业版 Vmware workstation 14.1.1 Ubuntu 16.04.3 ...