码迷,mamicode.com
首页 > 编程语言 > 详细

定制化Azure站点Java运行环境(5)

时间:2016-02-20 00:39:04      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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运行环境(5)

标签:

原文地址:http://www.cnblogs.com/cloudapps/p/5202478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!