JVM元空间深度解析
回顾一下上一次对于这次做的实验的一个背景说明:

这里将借助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元空间深度解析的更多相关文章
- JVM内存区域解析
引言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的 ...
- JVM 类加载器命名空间深度解析与实例分析
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...
- JVM 完整深入解析
工作之余,想总结一下JVM相关知识.以下内容都是针对于jdk1.7的. Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途 ...
- java中对JVM的深度解析、调优工具、垃圾回收
jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...
- JVM(五)手动解析.class文件
一:不同进制之间的转换 二进制:逢2进1,数字0-1. 八进制:逢8进1,数字0-7.三位二进制表示一位八进制.三位二进制最大为111,最大为7. 十进制:逢10进1,数字0-9.四位二进制表示一位十 ...
- JVM系列(三):JVM创建过程解析
上两篇中梳理了整个java启动过程中,jvm大致是如何运行的.即厘清了我们认为的jvm的启动过程.但那里面仅为一些大致的东西,比如参数解析,验证,dll加载等等.把最核心的loadJavaVM()交给 ...
- JVM元空间(Metaspace)
本文转载自JVM学习--元空间(Metaspace) 从方法区(PermGen)到元空间(Metaspace) 方法区(PermGen) JDK1.8以前的HotSpot JVM有方法区,也叫永久代( ...
- 从字节码和JVM的角度解析Java核心类String的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
- 【JVM】jvm虚拟机参数解析
转载:https://blog.csdn.net/see__you__again/article/details/51998038不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正 ...
随机推荐
- Django:序列化的几种方法
前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...
- mysql 严格模式 Strict Mode
mysql 严格模式 Strict Mode 找到MySQL安装目录下的my.cnf(windows系统则是my.ini)文件 在sql_mode中加入STRICT_TRANS_TABLES则表示开启 ...
- Deep Learning Recommendation Model for Personalization and Recommendation Systems
这篇文章出自facebook,主要探索了如何利用类别型特征(categorical features)并且构建一个深度推荐系统.值得注意的是,文章还特别强调了工业实现上如何实现并行,也很良心地给出了基 ...
- P1993 小K的农场(差分约束)
小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...
- `GLIBCXX_3.4.15' not found when using mex file in matlab (linux)
from: http://www.360doc.com/content/14/0314/16/175261_360565922.shtml Invalid MEX-file '*/*/*.mexa64 ...
- C++ 与 MATLAB 混合编程总结(14)
1. 前言 因为毕业设计的需求,研究了一下,C++如何与MATLAB一起混合编程,中间走了一些弯路,这里总结一下. 我用的主要是C++如何调用MATLAB,而没有涉及MATLAB如何调用C++. 注意 ...
- PAT(B) 1052 卖个萌(Java:0分 待解决,C:20分)
题目链接:1052 卖个萌 (20 point(s)) 题目描述 萌萌哒表情符号通常由"手"."眼"."口"三个主要部分组成.简单起见,我们 ...
- 编译内核提示mkimage command not found – U-Boot images will not be built
转載與:http://www.mr-wu.cn/u-boot-tools-binary-package-in-ubuntu/ ubuntu 编译linux kernel时提示: “mkimage” ...
- 模拟费用流 & 可撤销贪心
1. CF730I Olympiad in Programming and Sports 大意: $n$个人, 第$i$个人编程能力$a_i$, 运动能力$b_i$, 要选出$p$个组成编程队, $s ...
- VK Cup 2017 - Round 1 (CDE)
771C Bear and Tree Jumps 大意: 给定树,每步能走到距离不超过$k$的任意点,记$f(s,t)$为$s$到$t$的最少步数,求$\sum\limits_{s<t}f(s, ...