java虚拟机 jvm 方法区实战-阿里云开发者社区

开发者社区> 分享达人> 正文

java虚拟机 jvm 方法区实战

简介: 和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢。字段、方法、常量池。方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息。
+关注继续查看

java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢。字段、方法、常量池。方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息。(内存溢出后面相关文章给大家总结)

jdk6jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize-XX:MaxPermSize制定。默认情况下-XX:MaxPermSize64MB.如果你项目中使用代理模式或者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

                   

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java8 Stream新特性详解及实战
Java8 Stream新特性详解及实战
2 0
Java10 初体验(实战)
最近 IDEA 发布支持 java10的新版本。 Java10 简介: 详细版本更新特性请查看国外的一篇文章:https://www.azul.com/109-new-features-in-jdk-10/ 我在这里只简单的介绍 最热的一个特性:局...
796 0
Java 网络编程实战(一) - 简介
Java 网络编程实战(一) - 简介
14 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8413 0
《Java8实战》-读书笔记第一章(02)
从方法传递到Lambda 接着上次的Predicate,继续来了解一下,如果继续简化代码。 把方法作为值来传递虽然很有用,但是要是有很多类似与isHeavyApple和isGreenApple这种可能只用一两次的方法定义一堆确实有点烦人。
1663 0
Java 网络编程实战(二) - Unix的I/O模型解析
Java 网络编程实战(二) - Unix的I/O模型解析
15 0
JAVA 虚拟机钩子
Shutdown Hook Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。
644 0
实战分析ARP***与欺骗
 分析ARP***与欺骗   如上图所示,路由器的IP地址为:192.168.1.1,也是两台主机A、B的网关;交换机只需开启端口,不做任何设置;主机A作为***者,桥接到虚拟机windowsXP,IP地址为:192.168.1.2,安装网络执法官软件;主机B作为被***者,桥接到虚拟机Windows Server 2003,IP地址为:192.168.1.3,安装arp防火墙,然后再安装sniffer抓包工具,查看在开启arp防火墙之前,遭到***时抓到的包和开启防火墙之后的包有什么不同。
812 0
网关与子设备开发实战(java)
在很多物联网场景中,终端设备本身没有连接互联网能力,那么数据如何上云呢?
3785 0
+关注
分享达人
开源爱好者,喜欢钻研新技术。Activiti权威指南一书作者。
131
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载