java8永久代的简单介绍

博主:adminadmin 2022-11-25 14:53:06 204

本篇文章给大家谈谈java8永久代,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java 8的MetaSpace和以前永久代的区别在哪里

因为MetaSpace不控制就会无限增大,直到把机器内存都耗光

所以启动参数里设了个MaxMetaspaceSize,但这样的后果就是tomcat重新部署几次之后还是OutOfMemory了,错误信息变成

java.lang.OutOfMemoryError: Metaspace

没看出来跟以前比有啥优势呀

常用JVM参数(JDK 8)

-Xss :线程栈空间

-Xms : 初始堆空间,如: -Xms512M

-Xmx : 最大堆空间,如: -Xmx512M

-XX:MinHeapFreeRatio : 堆空间最小空闲比,当堆空间空闲内存小于这个数值时,JVM会扩展堆空间。

-XX:MaxHeapFreeRatio : 堆空间最大空闲比,当堆空间空闲内存大于这个数值时,JVM会压缩堆空间,得到一个较小的堆。

-XX:NewSize : 新生代初始空间

-XX:MaxNewSize : 最大新生代空间

-Xmn : 相当于设置相同的 -XX:NewSize 和 -XX:MaxNewSize .

-XX:SurvivorRatio : 新生代中eden空间和s0空间的比例

-XX:TargetSurvivorRatio : survivor区的可使用率,当survivor区的空间使用率达到这个数值时,会将对象送入老年代。

-XX:NewRatio : 老年代 / 新生代的空间比例

-XX:MetaspaceSize=512m : 分配给类元数据空间的初始大小,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。

-XX:MaxMetaspaceSize=512m : 分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值

-XX:MinMetaspaceFreeRatio ,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。

-XX:MaxMetaspaceFreeRatio ,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

-XX:CompressedClassSpaceSize=512m : 类指针压缩空间大小, 默认为1G

-XX:+PrintGCDetails : 打印GC细节

-XX:+PrintGC :

-XX:+PrintGCTimeStamps :

-XX:+PrintHeapAtGC :

Java 8 以前的JVM内存结构图:

其中:

虚拟机栈 在运行时使用 栈帧 保存上下文,栈帧中存储了以下内容:

更为精细地, 堆 和 方法区 的结构如下:

堆 分为 新生代 和 老年代 .

新生代 分为 Eden区 、 s0区(survivor space0或from space) 和 s1区(survivor space1或to space) 。

大部分新创建的对象进入Eden区,幸存区s0区和s1区存放经历了至少一次GC的“幸存者”。如果幸存区中的对象到了指定年龄仍未被回收,则有机会进入 老年代(tenured)

对于习惯了HotSpot虚拟机的程序员来说,很多都愿意将 方法区 称作 永久代 。本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是Java虚拟机规范,永久代是Hotspot针对该规范进行的实现。

堆 和 方法区 都是被JVM中所有线程共享的。

Java 8以后的JVM内存结构图:

Java8中,Hotspot取消了永久代,永久代的参数 -XX:PermSize 和 -XX:MaxPermSize 也随之失效。

对于Java8,HotSpots取消了永久代,是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中, 方法区存在于元空间(Metaspace) 。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

本地内存(Native memory) ,也称为 C-Heap ,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但本地内存空间不够却不会触发GC。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中 java.lang.OutOfMemoryError: PermGen space 这种错误。默认情况下元空间是可以无限使用本地内存的,但JVM同样提供了参数 -XX:MaxMetaspaceSize 来限制它使用的空间。

Java永久代去哪儿了

Java 8: 从永久代(PermGen)到元空间(Metaspace)

正如大家所知,Java8的新特性之一,是Oracle从JDK7发布以来就一直宣称的要完全移除永久代空间。例如,字符串内部池,已经在JDK7中从永久代中移除。JDK8的发布将宣告它的终结。 PermGen 继任者:Metaspace。

元空间(Metaspace):

一种新的内存空间的诞生

JDK8 HotSpot JVM 使用本地内存来存储类元数据信息并称之为:元空间(Metaspace);这与Oracle JRockit 和IBM JVM’s很相似。这将是一个好消息:意味着不会再有java.lang.OutOfMemoryError: PermGen问题,也不再需要你进行调优及监控内存空间的使用……但请等等,这么说还为时过早。

在默认情况下,这些改变是透明的,接下来我们的展示将使你知道仍然要关注类元数据内存的占用。

请一定要牢记,这个新特性也不能神奇地消除类和类加载器导致的内存泄漏。

你需求使用不同的方法以及遵守新的命名约定来追踪这些问题。

总结如下:

PermGen 空间的状况

这部分内存空间将全部移除。

JVM的参数:PermSize 和 MaxPermSize 会被忽略并给出警告(如果在启用时设置了这两个参数)。

Metaspace 内存分配模型

大部分类元数据都在本地内存中分配。

用于描述类元数据的“klasses”已经被移除。

Metaspace 容量

默认情况下,类元数据只受可用的本地内存限制(容量取决于是32位或是64位操作系统的可用虚拟内存大小)。

新参数(MaxMetaspaceSize)用于限制本地内存分配给类元数据的大小。如果没有指定这个参数,元空间会在运行时根据需要动态调整。

Metaspace 垃圾回收

对于僵死的类及类加载器的垃圾回收将在元数据使用达到“MaxMetaspaceSize”参数的设定值时进行。

适时地监控和调整元空间对于减小垃圾回收频率和减少延时是很有必要的。持续的元空间垃圾回收说明,可能存在类、类加载器导致的内存泄漏或是大小设置不合适。

Java 堆内存的影响

一些杂项数据已经移到Java堆空间中。升级到JDK8之后,会发现Java堆 空间有所增长。

Metaspace 监控

元空间的使用情况可以从HotSpot1.8的详细GC日志输出中得到。

Jstat 和 JVisualVM两个工具,在我们使用b75版本进行测试时,已经更新了,但是还是能看到老的PermGen空间的出现。

前面已经从理论上充分说明,下面让我们通过“泄漏”程序进行新内存空间的观察……

PermGen vs. Metaspace 运行时比较

为了更好地理解Metaspace内存空间的运行时行为,我们建立了一个类元数据泄漏程序。可以从此处下载源代码。

方法区, 永久代, 元空间, GC日志

永久区(Impl)是方法区(一种规范,interface)的一种实现,方法区不是heap(实际上方法区别名nonheap,就是想和heap分开). 永久区是一种常驻内存区域,没有GC,存放的是JDK自带的Class,Interface等元数据(所以Java8之后叫metaspace"元空间"), i.e. 存储的是Running Environment所必须的类信息,装进此区域的数据不会被GC,关闭JVM才会释放此区域占用的内存。

IDEA中可以在VM options中调节VM的配置: e.g. -Xmx100m -Xms100m -XX: +PrintGCDetails ( PrintVMOptions ). etc.

重现 OutOfMemoryError: Java heap space : e.g.

Only shows GC OOM error part:

怎么看:

[名称: GC前内存占用-GC后内存占用(该区总内存大小)] , 所有 [] 之后的那个最大的 A-B 是JVM堆的总大小,然后是这次GC耗时。从第一个 PSYoungGen 中看出YoungGen占整个heap的大小差不多是1/3

注:

java8永久代的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java8永久代的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。