4年前 (2020-09-21)  爪哇岛 |   抢沙发  700 
文章评分 0 次,平均分 0.0

在每种编程语言中,内存都是一种重要的资源,而且本质上也是稀缺的。因此,必须对内存进行彻底的管理,而不存在任何泄漏。在本文中,我们将了解什么是元空间,以及它与permgen有何不同。

在理解元空间之前,让我们先了解一下JVM内存结构。

JVM内存结构

JVM定义了在程序执行期间使用的各种运行时数据区域。有些区域是由JVM创建的,而有些是由程序中使用的线程创建的。但是,JVM创建的内存区域只有在JVM退出时才会被销毁。线程的数据区域在实例化期间创建,当线程退出时销毁。JVM内存结构分为堆区、堆栈区、方法区、PC寄存器等多个内存区,下图展示了Java中不同的内存区:

Java8中的元空间metaspace及其示例

在这里,堆是JVM最重要的内存区域之一。在这里,所有java对象都被存储。堆是在JVM启动时创建的。堆一般分为两部分。即:

  • Young Generation年轻代(托儿所):所有新对象都被分配到这个内存中。每当这个内存被填满时,就会执行垃圾回收。这称为小垃圾收集。
  • Old Generation老年代:所有经过多次小型垃圾收集的长寿命物体都存放在这个区域。每当这个内存被填满时,就会执行垃圾回收。这称为主要垃圾收集。

Java8中的元空间metaspace及其示例

除了堆内存之外,JVM还包含另一种类型的内存,称为永久生成或PermGen

Java8中的元空间metaspace及其示例

PermGen内存:这是java堆中的一个特殊空间,它与主内存分开,所有静态内容都存储在这个部分中。除此之外,这个内存还存储JVM所需的应用程序元数据。元数据是用来描述数据的数据。在这里,垃圾回收和内存的其他部分一样发生。

在Java7之前,字符串池也是内存的一部分。方法区域是PermGen中空间的一部分,用于存储类结构以及方法和构造函数的代码。

PermGen最大的缺点是它包含有限的大小,这会导致OutOfMemoryError。PermGen内存的默认大小在32位JVM上为64 MB,在64位版本上为82 MB。因此,JVM必须通过频繁地执行垃圾回收来改变内存的大小,这是一个代价高昂的操作。Java还允许手动更改PermGen内存的大小。但是,PermGen空间不能自动增加。因此,很难对其进行调谐。而且,垃圾回收器的效率不足以清理内存。

由于上述问题,PermGen在java8中已经被完全删除。在PermGen的位置上,引入了一种称为MetaSpace的新特性。默认情况下,元空间会自动增长。在这里,当类元数据使用量达到其最大元空间大小时,将自动触发垃圾回收。

下表说明了metaspace和PermGen之间的区别:

Java8中的元空间metaspace及其示例

但是metaspace自动增长的速度如果赶不上类生成的速度或者GC来不及回收,还是会引起OutOfMemory的问题:https://javakk.com/433.html

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/436.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册