码迷,mamicode.com
首页 > 其他好文 > 详细

JVM7、8详解及优化

时间:2017-07-26 18:05:19      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:方法   内存错误   永久   att   water   href   堆内存   int   configure   

一、引言:永久代为什么被移出HotSpot JVM了?

详见:JEP 122: Remove the Permanent Generation 
原因主要有两个:

  • 1、由于Permanent Generation内存经常不够用或发生内存泄露,引发恼人的java.lang.OutOfMemoryError: PermGen (在Java Web开发中非常常见)。
  • 2、移除Permanent Generation可以促进HotSpot JVM与 JRockit VM的融合,因为JRockit没有永久代。

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

根据上面的各种原因,永久代最终被移除,方法区移至Metaspace,字符串常量移至Java Heap

1. JVM堆内存划分

这两天看到下面这篇文章的图不错。

一图读懂JVM架构解析

技术分享

1.1 JDK7及以前的版本

技术分享

其中最上一层是Nursery内存,一个对象被创建以后首先被放到Nursery中的Eden内 
存中,如果存活期超两个Survivor之后就会被转移到长时内存中(Old Generation)中。

永久内存中存放着对象的方法、变量等元数据信息。通过如果永久内存不够,就会得到如下错误:

Java.lang.OutOfMemoryError: PermGen
  • 1
  • 1

1.2 JDK8版本

技术分享

JDK8中把存放元数据中的永久内存从堆内存中移到了本地内存(native memory)中,这样永久内存就不再占用堆内存,它可以通过自动增长来避免JDK7以及前期版本中常见的永久内存错误(Java.lang.OutOfMemoryError: PermGen)。

JDK8也提供了一个新的设置Matespace内存大小的参数:

-XX:MaxMetaspaceSize=128m
  • 1
技术分享
  • 1

注意:如果不设置JVM将会根据一定的策略自动增加本地元内存空间。如果你设置的元内存空间过小,你的应用程序可能得到以下错误:

java.lang.OutOfMemoryError: Metadata space

JVM7、8详解及优化

标签:方法   内存错误   永久   att   water   href   堆内存   int   configure   

原文地址:http://www.cnblogs.com/jtlgb/p/7240192.html

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