jvm-线程共享区域

Author Avatar
丁起男 12月 29,2020
  • 在其它设备中阅读本文章

jvm-线程共享区域

堆区

堆区heap是jvm中最大的一块内存区域,基本上所有的对象实例都是在堆上分配空间。堆区分为年轻代和老年代,其中年轻代又分为eden、s0、s1三个部分,他们默认的比例是8:1:1

方法区

在《java虚拟机规范》中只是规定了有方法区这么个概念跟它的作用。HotSpot在jdk8之前,搞了个永久代把这个概念实现了。用来主要存储类信息、常量池、静态变量、jit编译后的代码等数据

PermGen(永久代)中类的元数据信息每次FullGC的时候可能会被收集,但成绩很难令人满意。而且为PermGen分配多大的空间因为存储多种数据很难缺点大小。因此官方在jdk8去除永久代

移除永久代是为了融合HotSpot JVM与JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代

元空间

在java中永久代来存储类信息、常量、静态变量等数据不是好办法,因为这样很容易造成内存溢出。同时对永久代的性能调优也很困难,因此在jdk8中把永久代去除了,引入了元空间metaspace,原先的class、field等变量放入到metaspace

总结

元空间的本质和永久代类似,都是对jvm规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下,元空间的大小受本地内存限制,但可以通过参数来指定元空间的大小

原文:https://mp.weixin.qq.com/s/GfAfffbF_uiphN0Zd3YouQ