最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
java虚拟机jvm方法区代码实例解析
时间:2021-02-22 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下java虚拟机jvm方法区代码实例解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize为64MB.如果你项目中使用代理模式或者CGpB的话可能在运行的时候生成大量的类,如果这样,需要设置一下永久区的大小,防止永久区内存溢出。
CGpB会在后面专门的章节和代理模式一起讲解。(这个系列专注的是JVM的讲解)
使用下面代码:
for (int i = 0; i <10000; i++) { CglibWapper c=new CglibWapper("cn.springok.perm"+i) }
代码解释:会根据传入的参数动态生成一个类以及类的实例。因为对象实例化,类的字段、方法、常量池保存在方法区,因此操作会占用一定内存的。
大量的类可能导致方法区溢出,使用下面的参数运行代码:
-XX:PermSize=10M -XX:MaxPermSize=10M -XX:PrintGCDetails
参数说明:
-XX:PermSize=10M 初始永久区大小10M
-XX:MaxPermSize 方法区最大内存10M。
-XX:PrintGCDetails 打印日志详情。
执行程序部分输出如下:
compacting perm gen total 86272K, used 86136K [0x44600000, 0x49a40000, 0x64600000)
the space 86272K, 99% used [0x44600000, 0x49a1e2f8, 0x49a1e400, 0x49a40000)
系统内存溢出了,扩大-XX:MaxPermSize值,可以生成更多的类。
可以使用工具Visual VM观察方法区的具体使用情况。
需要注意一点:
jdk8中永久区被移除了,取而代之的是元数据区,可能方法区依赖jvm的内存吧。元数据区可以使用-XX:MaxMetaspaceSize制定,跟之前版本的-XX:MaxPermSize一样,分配的值越多,就可以支持更多的类。不同的是元数据区是堆外直接内存,与方法永久区不同,在不指定大小的情况下,虚拟机会耗尽所有可用的系统内存。
元数据区发生溢出,虚拟机一样抛出异常,如下:
java.lang.OutOfMemoryError Metaspace
-
上一个: Java字节码中jvm实例用法介绍
-
下一个: java使用IO流对数组排序实例代码解析
相关文章
- SpringBoot自定义bean绑定解析 10-24
- Javaweb工程运行报错HTTP Status 404解决教程 10-20
- JAVA获取jvm和操作系统相关信息方法 10-20
- BeanFactory和FactoryBean的区别讲解 10-20
- 微信小程序的宿主环境实现教程 10-10
- dispatchEvent解决重叠元素响应事件教程 10-10