Java 8下PermGen及参数设置

在上一章节中,我们定制化使用了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,那么一旦在运行过程中加载的类超过了这个大小限制,你就会马上碰到那个著名的OOM(out of memory)错误,当然这种设计除了会出现OOM,也会有无法动态调整,很难调优等缺点,也会导致一系列的bug和性能问题,例如:

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

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

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

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

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

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

网站运行java_定制化Azure站点Java运行环境(5)相关推荐

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

    Azure website提供了为现代化的web应用程序快速部署的PAAS平台,可以让用户几分钟之内快速的将自己的应用部署到云端,并且提供了自动扩展(auto-scaling),SSL,多种语言(Ja ...

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

    Azure Website上发布Java web应用 在Azure站点上发布Java Web应用非常简单,可以使用git从源代码发布,也可以使用FTP/FTPs直接发布,本节介绍FTP方式. 准备好你 ...

  3. arduino运行java_调试在Arduino MKR1000上运行的Arduino Uno代码

    所以,我是Arduino的业余程序员,之前从未使用过Arduino MKR1000 . 我使用了Arduino Uno并使用Grove Ear夹心跳传感器和Grove温度传感器编写附加代码来检测心跳和 ...

  4. kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?

    文章目录 1. Prometheus 简介 2. Prometheus 优势 3. Prometheus 架构图 4. Prometheus-Operator 简介 5. Prometheus-Ope ...

  5. OpenRasp Java运行时修改字节码技术

    Java运行时修改字节码技术 Java运行时动态修改字节码技术,常用的有javassist asm来实现.不过最近在分析openrasp-java这块时,程序使用的javassist来动态插桩关键类, ...

  6. 02.Java开发环境搭建

    Java为什么需要配置开发环境呢? 不是说Java一次编写处处运行吗?为什么还要配置Java环境? 答:Java程序是在JVM中运行的,那JRE是Java运行环境里面包含了Java运行核心类库和JVM ...

  7. Java开发环境的搭建与基础语法(温习知识点)

    复习昨日内容 * Java语言概述* Java语言概述&发展史[了解]* Java的跨平台[了解]* JDK JRE JVM 有什么作用[理解] * Java开发环境的搭建 * JDK的下载与 ...

  8. 传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!

    背景 Cars.com 是美国的汽车门户网站,为用户提供各种购车相关的信息和资讯,类似于国内的汽车之家. 他们之前的技术栈是比较传统的 Java Web 结构:Java 7,  Websphere/W ...

  9. (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定...

    本文是<快速创建网站>系列的第6篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

最新文章

  1. 利用基于GPU的AI模拟一个现实宇宙 仅需36分钟
  2. 敏捷开发中Scrum方法
  3. STM32F103C8T6 CAN通信详解
  4. python view函数_Python爬虫实例(二)——爬取新馆疫情每日新增人数
  5. appium 移动端自动化测试工具(4)
  6. Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)
  7. php js date 格式化,javascript date格式化示例_javascript技巧
  8. Python中类与对象的关系
  9. python import 错误 TypeError: 'module' object is not callable
  10. java输入年月输出日历_12月营销热点日历 | 2020年创意冲刺倒计时!
  11. 高中生住校好还是走读好?为什么?
  12. linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
  13. setup.s (读核笔记系列)
  14. 什么是Meta分析异质性,怎么处理Meta分析异质性?看完这篇就够了
  15. C#中new一个对象的过程说明
  16. 《高等数学B(一)》笔记
  17. java fifo lifo_栈方法 LIFO - 队方法 FIFO
  18. 极光推送第一次进入APP无法获取RegistrationID
  19. 极路由 openwrt 使用 SyncY 实现百度云同步
  20. docker 中文乱码解决

热门文章

  1. 苹果手机6s运营商在哪里显示无服务器,iPhone6s信号很弱或无服务如何解决【解决方法】...
  2. 可能是全网首个前端源码共读活动,诚邀你加入一起学习
  3. oracle 11g 创建 job 20
  4. Linux下的用户和组
  5. windows update更新失败 安全模式进不去
  6. android:versionCode和android:versionName 用途
  7. Jar包转成Dll的方式(带嵌套的jar也能做) (转)
  8. View controller-based status bar
  9. Distributed transactions with multiple databases, Spring Boot, Spring Data JPA and Atomikos
  10. 三、SpringBoot-application.properties配置文件和application.yml配置文件