深入理解JVM------Java内存区域

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


一、 JVM运行时数据区域概览

深入理解JVM------Java内存区域_Java

JDK1.7 JVM运行时内存区域

深入理解JVM------Java内存区域_Java_02


JDK1.8 JVM运行时内存区域

二、各区域介绍

1.程序计数器(线程私有)
是一个内存较小的区域,是线程私有的。可以看作是当前线程所执行字节码指令的行号指示器。
作用:字节码解释器就是根据这个计数器的值来选定下一条需要执行的字节码指令,分支、跳转、循环等基础功能都是依靠这个程序计数器来完成的。
是JVM规范中唯一一个不会出现OOM问题的区域!

2.Java虚拟机栈(线程私有)
Java虚拟机栈描述的是Java方法执行的内存模型。栈也叫栈内存,主管Java方法的运行,在线程创建时创建,生命周期与线程相同,是线程私有的。线程结束栈内存也就释放,不存在垃圾回收。
运行原理:每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。Java方法从调用到执行完毕的过程就对应栈帧在虚拟机栈中入栈到出栈的过程。栈的大小和具体JVM的实现有关,通常在256K~756K之间,与等于1Mb左右。

3.本地方法栈
本地方法栈是为Java虚拟机的Native方法服务。本地方法一般是由C、C++、或汇编语言编写的。并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。

4.Java堆(线程共享)
Java堆是内存管理中最大的一块区域,在虚拟机启动时创建,是线程共享的区域。
其唯一目的:就是为了分配对象实例,几乎所有的实例都从堆上进行。
Java堆是垃圾回收的主要区域,也称为GC堆。可以分为新生代和老年代(比例 1/3 : 2/3)。
Java堆中还可以划分指出多个线程私有的分配缓冲区(TLAB)
Java堆可以存储在物理上不连续的内存空间之中
ps:JDK1.7后,字符串常量池从永久代中剥离出来,存放在堆中
5.方法区(线程共享)
用于存放Class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。

用于存储已被虚拟机加载的类信息,常量,静态变量,

方法区可以选择不实现垃圾收集,他的**内存回收目标主要是针对常量池的回收和对类型的卸载!

方法区是JVM的一种规范,1.7的实现是永久代,1.8的实现是元空间。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。

(1)Perm的废除:在jdk1.8中,Perm被替换成MetaSpace,MetaSpace存放在本地内存中。原因是永久代进场内存不够用,或者发生内存泄漏。
(2)MetaSpace(元空间):元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java