JVM7、8詳解及優化


一、引言:永久代為什么被移出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架構解析

JVM-Architecture

1.1 JDK7及以前的版本

JVM7

其中最上一層是Nursery內存,一個對象被創建以后首先被放到Nursery中的Eden內 
存中,如果存活期超兩個Survivor之后就會被轉移到長時內存中(Old Generation)中。

永久內存中存放着對象的方法、變量等元數據信息。通過如果永久內存不夠,就會得到如下錯誤:

Java.lang.OutOfMemoryError: PermGen
  • 1
  • 1

1.2 JDK8版本

JVM8

JDK8中把存放元數據中的永久內存從堆內存中移到了本地內存(native memory)中,這樣永久內存就不再占用堆內存,它可以通過自動增長來避免JDK7以及前期版本中常見的永久內存錯誤(Java.lang.OutOfMemoryError: PermGen)。

JDK8也提供了一個新的設置Matespace內存大小的參數:

-XX:MaxMetaspaceSize=128m
  • 1
  • 1

注意:如果不設置JVM將會根據一定的策略自動增加本地元內存空間。如果你設置的元內存空間過小,你的應用程序可能得到以下錯誤:

java.lang.OutOfMemoryError: Metadata space


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM