定制化Azure站点Java运行环境

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定制化Azure站点Java运行环境相关的知识,希望对你有一定的参考价值。

Java 8PermGen及参数设置

?

在上一章节中,我们定制化使用了Java 8环境,使用我们的测试页面打印出了JVM基本参数,但如果我们自己观察,会发现在MXBeans中,没有出现PermGen的使用数据,初始大小等信息,即使我们已经设置了大小:

技术分享

技术分享

?

在Java 7及以前版本中,PermGen主要存放加载的类的信息,如果设置过小,类加载失败,可能会出现OutOfMemory的经典错误,在Azure website里面的Java开发中,碰到的客户定制化设置的问题也会涉及到PermGen的大小定制化。

那么在Java 8里面,PermGen去哪了呢?

我们可以先来看一下JVM的内存模型,JVM的内存分为Heap memory和Non-Heap memory,Heap memory主要会存放一些Java Object对象信息,而non-heap memory如PermGen主要会存放一些加载的Java classes和元数据信息。技术分享

在Java 8之前的Java版本当中,Heap size可以通过 MS, MX进行大小设置,而PermGen可以通过PermSize, MaxPerm在Java option中进行大小设置。之前的JVM的一个明显问题是,你在启动的时候设置了?XX:MaxPermSize,那么一旦在运行过程中加载的类超过了这个大小限制,你就会马上碰到那个著名的OOMout of memory)错误,当然这种设计除了会出现OOM,无法动态调整,很难调优,也会导致了一系列的bug和性能问题,例如:

http://bugs.java.com/view_bug.do?bug_id=6962931

因此上,在Java 8的设计中,Oralce和Java社区放弃了PermGen,从此之后不再有PermGen这样一个东西,但是元数据依然是需要保存的,所以在Java 8中,元数据移到了本地内存中,叫Metaspace的地方。

技术分享

那么对于最终用户来讲呢,你不会因为PermGen碰到OOM的问题,因为你所有的有效系统内存都可以做Metaspace了,所以你不需要单独设置metaspace,在一个64位系统的机器中,默认的Metaspace初始大小是21MB,那么最大呢?理论上如果你的元数据真的非常多,加载的类也很多,理论上最大可以用光你所有的有效系统内存。

那么有没有办法设置或者限制Metaspace的大小呢?可以,Java提供了两个参数来让你在必要的情况下设置Metaspace的大小:

–XX:MetaspaceSize64微系统默认21MB,你可以设置大一些避免频繁的full GC

-XX:MaxMetaspaceSize:理论上大小没有限制,但你可以设置一个限制值

?

回到我们的Azure websiteJava OPTS的设置上,在Java 8的环境里面PermSize已经无用了,所以web.config中设置可简化为:

技术分享

以上是关于定制化Azure站点Java运行环境的主要内容,如果未能解决你的问题,请参考以下文章

定制化Azure站点Java运行环境

定制化Azure站点Java运行环境

定制化Azure站点Java运行环境

定制化Azure站点Java运行环境

Azure Stack中添加镜像

正在修改或添加应用程序设置到在 linux 容器上运行的 azure 应用程序服务将回收站点