JVM-运行时数据区-方法区

一、栈、堆、方法区的交互关系

Person person = new Person();

在该条语句中,Person存放在方法区,person的实现类存放在Java栈,new Person()存放在堆空间中。

Person会将该类的结构和.class文件存放在方法区,而new出来的对象:new Person()则存放在堆空间中。

二、方法区的基本理解

  • 方法区与Java堆一样,是各个线程共享的内存区域。
  • 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
  • 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区一处,虚拟机同样会抛出内存一处的错误:java.lang.OutOfMemoryError:PermGen space(永久代 jdk1.7)或者 java.lang.OutOfMemoryError: Metaspace(元空间 jdk1.8以上)。
    • 加载大量的第三方jar包:Tomcat部署的工程过多(30~50个);大量的动态生成反射类。

三、方法区内部结构

3.1、方法区储存什么

它用于储存已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

3.2、类型信息

对于每个加载的类型(类class、接口interface、枚举enum、主机annotation),JVM必须在方法区中存储以下类型信息:

  • 这个类型的完整有效名称(全名=包名.类名)
  • 这个类型直接父类的完整有效名(对于interface或是java.lang.Object,都没有父类)
  • 这个类型的修饰符(public,abstract,final的某个子集)
  • 这个类型直接接口的一个有序列表

3.3、域(Field)信息

  • JVM必须在方法区中保存类型的所有域的相关信息以及域的声明顺序。
  • 域的相关信息包括:域名称、域类型、域修饰符(public,private、protected、static、final、volatile、transient的某个子集)

3.4、方法信息

3.5、运行时常量池

四、永久代为什么要被元空间替换?(面试题)

1、永久代设置空间大小是很难确定的。

因为在特定场景下,可能使用的常量很多,会导致STW(Stack Overflow),而且很容易触发full GC。

2、对永久代进行调优是很困难的。

3、因为元空间是直接内存,因此IO有着更高的性能。

五、方法区的垃圾收集主要收集什么?

常量池中的废弃常量和不再使用的类型。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值