JDK1.6、JDK1.7、JDK1.8 内存模型对比
不同版本jdk的jvm内存结构图:
如图25-1 是 JDK 1.6、1.7、1.8 的内存模型演变过程,其实这个内存模型就是 JVM 运行时数据区依照JVM虚拟机规范的具体实现过程。
JDK 1.6:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区[永久代](字符串常量池、静态变量、运行时常量池、类常量池)
JDK 1.7:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量、静态变量)、方法区[永久代](运行时常量池、类常量池)
JDK 1.8:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量)、元数据(静态变量、运行时常量池、类常量池)
JDK 1.8 JVM 的内存结构主要由三大块组成:堆内存、元空间和栈,Java 堆是内存空间占据最大的一块区域。
Java 堆,由年轻代和年老代组成,分别占据1/3和2/3。
年轻代又分为三部分,Eden、From Survivor、To Survivor,占据比例为8:1:1,可调。
元空间从虚拟机Java堆中转移到本地内存,默认情况下,元空间的大小仅受本地内存的限制,说白了也就是以后不会因为永久代空间不够而抛出OOM异常出现了。jdk1.8以前版本的 class和JAR包数据存储在 PermGen下面 ,PermGen 大小是固定的,而且项目之间无法共用,公有的 class,所以比较容易出现OOM异常。
升级JDK 1.8后,元空间配置参数,-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M。
小技巧通过jps、jinfo查看元空间,如下:
通过jinfo查看默认MetaspaceSize大小(约20M),MaxMetaspaceSize比较大。
其他:关于JDK1.8 元空间的介绍: Move part of the contents of the permanent generation in Hotspot to the Java heap and the remainder to native memory. http://openjdk.java.net/jeps/122
参考:https://www.jianshu.com/p/8d24230767a4?u_atoken=bc5371a4-aaf0-4c4e-8e32-c990be60229d&u_asession=01LE7JXs5C0gSgvgP9Ag83feOKLFGuqID1r8Qw7eTqcjtfYebgmUEUe8VNdNSr3a7eX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K-zgR_Ikw6tecQ9Pi6ZdT5uUPWO0ljqS-0m6uUj231Ub2BkFo3NEHBv0PZUm6pbxQU&u_asig=05znWRq41MaGvV2vCfboGRsJ7Kd46zvN8CGg74t-6u3QMrFIquyAgI6ogoHoiIiCUIwelj0qsnJhwuRunjPHiQpkQv5BdUZHJHSji7TcAA_1jlOE0oLvdytufeV9QJNvrf87jYtltM05atpQvcWdhLshvhu-GdhHfEPpvhQ1ou3nL9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzeTMEs4be6xm9xJeaB2WvovqcLeTScS_UI5kCHz3jEwfU1_gr7b-5Q11Fu-gS_hPv-3h9VXwMyh6PgyDIVSG1W981q_Ff1vHiAaNPGuh9K00M1CcDvpYE0FByRD-zGgt7a_S0Eza4O7z5s-ABa_GtkZRvCqR0YJNV8MXO1n1Xv90mWspDxyAEEo4kbsryBKb9Q&u_aref=wE%2FduKS8HGgxytd9fzPLUp%2BcGd8%3D