在上一篇文章中,小编为您详细介绍了关于《高考完之后姐送了我一个肾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》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器