java虚拟机 jvm 方法区实战
2016-04-03 07:23
246 查看
和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢。字段、方法、常量池。方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息。(内存溢出后面相关文章给大家总结)
jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize为64MB.如果你项目中使用代理模式或者CGLIB的话可能在运行的时候生成大量的类,如果这样,需要设置一下永久区的大小,防止永久区内存溢出。
CGLIB会在后面专门的章节和代理模式一起讲解。(这个系列专注的是JVM的讲解)
使用下面代码:
代码解释:会根据传入的参数动态生成一个类以及类的实例。因为对象实例化,类的字段、方法、常量池保存在方法区,因此操作会占用一定内存的。
大量的类可能导致方法区溢出,使用下面的参数运行代码:
-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
jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize为64MB.如果你项目中使用代理模式或者CGLIB的话可能在运行的时候生成大量的类,如果这样,需要设置一下永久区的大小,防止永久区内存溢出。
CGLIB会在后面专门的章节和代理模式一起讲解。(这个系列专注的是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
相关文章推荐
- spring @Qualifier注解使用
- 深入浅出讲Java
- Java位操作全面总结[ZZ]
- SpringMVC中时间数据格式问题
- 关于java mail 发邮件的问题总结(转)
- 深入理解Java回调函数
- Unable to open debugger port (localhost:8617): java.net.ConnectException "连接超时"
- 解决Java中MD5加密utf-8格式时与其他语言不同的问题
- spring @Qualifier注解使用
- JavaWeb相对路径
- 单例模式在spring的应用
- 利用Javamail接收QQ邮箱和Gmail邮箱(转)
- 191. Number of 1 Bits | Java最短代码实现
- java之命令行参数main(String [] args)
- Java后台线程
- eclipse下调试spring mvc ,github 帮助文档学习
- java和mysql存储过程
- 一天一排序之“堆排序(heapsort)”
- MAC下安装多版本JDK和切换几种方式
- 20145327 《Java程序设计》第五周学习总结