java运行时内存划分

jvm基础了解

jvm基础了解

程序计数器:

记录当前线程所执行的字节码行号,作用是用来获取下一条执行的字节码;当多线程运行时,每个线程切换后要知道线程上一次运行的状态、位置。所以可以看出程序计数器区域的每个线程是私有的。

虚拟机栈:

虚拟机栈由多个栈帧组成,每个栈帧都是调用每个方法时产生的;每个栈帧有局部变量区、操作数栈等组成。每创建一个栈帧压栈,当方法执行完毕后进行出栈;这块内存区域线程也是私有的。( 栈帧: 是用来存储数据和部分过程结果的数据结构。 栈帧的位置:  内存 -> 运行时数据区 -> 某个线程对应的虚拟机栈 。 栈帧大小确定时间: 编译期确定,不受运行期数据影响。

本地方法栈:

本地方法栈是与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++;这块内存区域线程也是私有的。

 堆

Java 堆是整个虚拟机所管理的最大内存区域,所有的对象创建都是在这个区域进行内存分配。

可利用参数 -Xms -Xmx 进行堆内存控制。

这块区域也是垃圾回收器重点管理的区域,由于大多数垃圾回收器都采用分代回收算法,所有堆内存也分为 新生代、老年代,可以方便垃圾的准确回收。

这块内存属于线程共享区域。

方法区(JDK1.7)

方法区主要用于存放已经被虚拟机加载的类信息,如常量,静态变量。 这块区域也被称为永久代。 可利用参数 -XX:PermSize -XX:MaxPermSize 控制初始化方法区和最大方法区大小。 方法区同堆一样,是所有线程共享的内存区域,为了区分堆,又被称为非堆。

元数据区(JDK1.8)

在 JDK1.8 中已经移除了方法区(永久代),并使用了一个元数据区域进行代替(Metaspace)。 默认情况下元数据区域会根据使用情况动态调整,避免了在 1.7 中由于加载类过多从而出现 java.lang.OutOfMemoryError: PermGen。 但也不能无线扩展,因此可以使用 -XX:MaxMetaspaceSize来控制最大内存。这部分空间是在本地内存中的。

jdk1.7之前与jdk1.8常量池的区别?

 

 

 

相关文章: