首先来看一下JVM在java平台中的位置
JVM:可以叫做内存管理(数据、指令、控制)
JVM运行时数据区
JDK1.7之前
java中执行最小单位:线程
1、程序计数器:指向当前线程正在执行的字节码指令地址
2、虚拟机栈:存储当前线程运行时所需要的数据、指令、返回地址(运行java方法)
3、本地方法栈: 运行本地方法,类似虚拟机栈
虚拟机栈数据共享逻辑图
4、方法区(永久代):类信息、常量(1.7.4之后有变化)、静态变量、JIT(1.7之前)
JIT:just in time,即时编译技术。使用该技术,可以加速java程序的运行速度。
5、Heap:分代机制
1.7之前
1.7之后
永久代变成了元空间(Meta Space)
举例:
String str = new String();
1.7之前,存放在方法区中
1.7之后,存放在Heap中
总结
Metaspace与永久代区别:
永久代使用的是JVM的堆内存,但是Metaspace并不在虚拟机中,而是使用计算机的物理内存。
Metaspace的大小受本地内存的限制,类的元数据放入本地内存,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据不再由MaxPermSize控制,而是由系统的实际空间控制。
这样并不是说Metaspace可以无限大了,Metaspace越大,Heap的空间就会越小,适合自己是做好的。
-XX:PermSize 设置持久代(perm gen)初始值,物理内存的1/64
-XX:MaxPermSize 设置持久代最大值,物理内存的1/4