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

这里将借助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. orleans 的一种模式

    为了避免过热的grain,按时间%cpu数,分派任务到grain中,然后有限制的去访问原来过热的grain.eg:tokengrain,1个半小时后,更新所有的grain.

  2. 使用Maven为SpringBoot项目打包

    一.maven通过命令行打jar包 进入项目目录,执行如下命令: mvn -Dmaven.test.skip -U clean package 发现报如下错误: [ERROR] Failed to e ...

  3. springboot的mapper.xml在src下问题

    在pom.xml里面的build标签加上resources说明 <resources> <!-- mapper.xml文件在java目录下 --> <resource&g ...

  4. java的ReentrantLock类详解

    ReentrantLock 能用于更精细化的加锁的Java类, 通过它能更清楚了解Java的锁机制 ReentrantLock 类的集成关系有点复杂, 既有内部类, 还有多重继承关系 类的定义 pub ...

  5. os删除文件或者文件夹

    最近在使用os.remove删除目录时报错了,这里记录下os操作文件或者目录的常用方法 递归删除文件或文件夹 import shutil shutil.rmtree() 文件的重命名 os.renam ...

  6. [转帖]Linux下逻辑地址、线性地址、物理地址详细总结

    Linux下逻辑地址.线性地址.物理地址详细总结 https://www.cnblogs.com/alantu2018/p/9002441.html 总结的挺好的 现在应该是段页式管理 使用MMU和T ...

  7. 使用AOP进行权限验证

    首先我们定义一个切入点(匹配com.ed.controller.Seller开头的controller的所有public方法) @Pointcut("execution(public * c ...

  8. python — 线程

    目录 1.线程基础知识 2 Thread 类 3 锁 4 队列 1.线程基础知识 1.1 进程与线程的区别 进程: 创建进程 时间开销大 销毁进程 时间开销大 进程之间切换 时间开销大 线程: 线程是 ...

  9. Linux和Windows系统目录结构区别

    Windows目录结构图 Linux目录结构图 我们所有的操作尽量都要在/home/username目录下进行. 快捷进入家目录方式是cd ~.

  10. 如何自定义xml文件

    在定义文件之前,首先要弄清楚什么是xml文件和dtd文件. 一:什么是xml文件? xml是一种可扩展标记性语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有构造性的标记语言. 二:什么事d ...