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

                   

相关文章
|
14天前
|
Oracle Java 关系型数据库
java体系结构和jvm
java体系结构和jvm
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
35 0
|
25天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
68 0
|
20小时前
|
监控 Ubuntu Java
Java VisualVM远程监控JVM
Java VisualVM远程监控JVM
Java VisualVM远程监控JVM
|
6天前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
|
1月前
|
存储 缓存 安全
[Java基础]——JVM内存模型
[Java基础]——JVM内存模型
|
1月前
|
算法 Java UED
【JVM】分代收集算法:提升Java垃圾回收效率
【JVM】分代收集算法:提升Java垃圾回收效率
20 0
|
1月前
|
存储 Kubernetes 云计算
云计算基础与实战:从虚拟机到容器化应用
云计算基础与实战:从虚拟机到容器化应用
32 0
|
1月前
|
Java
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
97 0
|
1月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
50 0