Java8取消permgen?如何看待阿里在JVMLS介绍的JVM三个方面的创新:多租户、协程和预热

发表时间:2018-03-04 00:00:03 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《高考完之后姐送了我一个肾6splus16G?苹果的应用内置购买的强势政策》相关知识。本篇中小编将再为您讲解标题Java8取消permgen?如何看待阿里在JVMLS介绍的JVM三个方面的创新:多租户、协程和预热。

如题,谢谢各位大神

在Java虚拟机(JVM)内部,class文件中包括类的版本、字段、方法、接口等描述信息,还有运行时常量池,用于存放编译器生成的各种字面量和符号引用。

在过去(自定义类加载器还不是很常见的时候),类大多是”static”的,很少被卸载或收集,因此被称为“永久的(Permanent)”。同时,由于类class是JVM实现的①部分,并不是由应用创建的,所以又被认为是“非堆(non-heap)”内存。

在JDK⑧之前的HotSpot JVM,存放这些”永久的”的区域叫做“永久代(permanent generation)”。永久代是①片连续的堆空间,在JVM启动之前通过在命令行设置参数-XX:MaxPermSize来设定永久代最大可分配的内存空间,默认大小是⑥④M(⑥④位JVM由于指针膨胀,默认是⑧⑤M)。永久代的垃圾收集是和老年代(old generation)捆绑在①起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。不过,①个明显的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误(对于这句话,译者的理解是:③②位的JVM默认MaxPermSize是⑥④M,而JDK⑧里的Metaspace,也可以通过参数-XX:MetaspaceSize 和-XX:MaxMetaspaceSize设定大小,但如果不指定MaxMetaspaceSize的话,Metaspace的大小仅受限于native memory的剩余大小。也就是说永久代的最大空间①定得有个指定值,而如果MaxPermSize指定不当,就会OOM)。

注:在JDK⑦之前的版本,对于HopSpot JVM,interned-strings存储在永久代(又名PermGen),会导致大量的性能问题和OOM错误。从PermGen移除interned strings的更多信息查看这里。

译者注:从JDK⑦开始永久代的移除工作,贮存在永久代的①部分数据已经转移到了Java Heap或者是Native Heap。但永久代仍然存在于JDK⑦ · 并没有完全的移除:符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。

在JDK⑦ update ④即随后的版本中,提供了完整的支持对于Garbage-First(G①)垃圾收集器,以取代在JDK⑤中发布的CMS收集器。使用G① · PermGen仅仅在FullGC(stop-the-word,STW)时才会被收集。G①仅仅在PermGen满了或者应用分配内存的速度比G①并发垃圾收集速度快的时候才触发FullGC。

而对于CMS收集器,通过开启布尔参数-XX:+CMSClassUnloadingEnabled来并发对PermGen进行收集。对于G①没有类似的选项,G①只能通过FullGC,stop the world,来对PermGen进行收集。

永久代在JDK⑧中被完全的移除了。所以永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了。

在JDK⑧中,classe metadata(the virtual machines internal presentation of Java class),被存储在叫做Metaspace的native memory。①些新的flags被加入:

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

-XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。

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

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

默认情况下,class metadata的分配仅受限于可用的native memory总量。可以使用MaxMetaspaceSize来限制可为class metadata分配的最大内存。当class metadata的使用的内存达到MetaspaceSize(③②位clientVM默认①②Mbytes,③②位ServerVM默认是①⑥Mbytes)时就会对死亡的类加载器和类进行垃圾收集。设置MetaspaceSize为①个较高的值可以推迟垃圾收集的发生。

Native Heap,就是C-Heap。对于③②位的JVM,C-Heap的容量=④G-Java Heap-PermGen;对于⑥④位的JVM,C-Heap的容量=物理服务器的总RAM+虚拟内存-Java Heap-PermGen

这里科普下,在Windows下称为虚拟内存(virtual memory),在Linux下称为交换空间(swap space),用于当系统需要更多的内存资源而物理内存已经满了的情况下,将物理内存中不活跃的页转移到磁盘上的交换空间中。

在JDK⑧ · Native Memory,包括Metaspace和C-Heap。

IBM的J⑨和Oracle的JRockit(收购BEA公司的JVM)都没有永久代的概念,而Oracle移除HotSpot中的永久代的原因之①是为了与JRockit合并,以充分利用各自的特点。

再见,再见PermGen,你好Metaspace

随着JDK⑧的到来,JVM不再有PermGen。但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。

类的元数据信息转移到Metaspace的原因是PermGen很难调整。PermGen中类的元数据信息在每次FullGC的时候可能会被收集,但成绩很难令人满意。而且应该为PermGen分配多大的空间很难确定,因为PermSize的大小依赖于很多因素,比如JVM加载的class的总数,常量池的大小,方法的大小等。

此外,在HotSpot中的每个垃圾收集器需要专门的代码来处理存储在PermGen中的类的元数据信息。从PermGen分离类的元数据信息到Metaspace,由于Metaspace的分配具有和Java Heap相同的地址空间,因此Metaspace和Java Heap可以无缝的管理,而且简化了FullGC的过程,以至将来可以并行的对元数据信息进行垃圾收集,而没有GC暂停。

内容来自:

编后语:关于《Java8取消permgen?如何看待阿里在JVMLS介绍的JVM三个方面的创新:多租户、协程和预热》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《关于小米的维修费用问题?inter至强e5260咋样 相当于酷睿什么样级别30》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题