目录
2.3 程序计数器(Program Counter Register)—线程私有
2.4 本地方法栈(Native Method Stack)—线程私有
2.5 虚拟机栈(Virtual Machine Stacks)—线程私有
1.Java内存管理机制
Java语言之所以可以霸占企业级开发很多年,就是因为Java有一套内存管理机制
2.运行时数据区
在程序执行过程中,JVM会用一段空间来存储程序执行期间常用的数据和信息,这一段内存空间被称为运行时数据区(Runtime Data Area),就是经常说了JVM内存,而我们常说的内存管理就是针对这一段空间来进行的,而运行时数据区被分为五个部分,如下图所示
每一个线程都会独立开辟私有的程序计数器,本地方法栈,虚拟机栈,因此这些组件的生命周期和线程的生命周期一致
而方法区和堆并不是独立开辟的,是所有线程共享的
2.1方法区(Method Area)—线程共享
方法区是所有线程共享的内存区域,它用于存储已经被Java虚拟机加载的类型信息,字段信息,方法信息,类变量,方法表,运行时常量池等数据,Java虚拟机规范把方法去描述为堆的一个逻辑部分,为了和堆区分开,所以取了个别名“非堆”,当方法区无法满足内存分配需求的时候,会抛出OutOfMemoryError异常
2.2Java堆(Java Heap)—线程共享
首先是干货:
Java堆区具有以下几个特点:
存储的是我们new来的对象,不存放基本类型和对象引用(基本对象和引用对象放在栈中这是基本常识)
由于创建了大量的对象,垃圾回收器主要工作在这块区域。
线程共享区域,因此是线程不安全的。
能够发生OutOfMemoryError。
Java堆是Java虚拟机所管理的内存最大的一块,是被所有线程共享的一个内存区域,在虚拟机启动时被创建,用于存放对象实例,在Java虚拟机规范中的描述是:
所有的对象(包含常量池)实例以及数组中都要在堆上分配
一句话来说就是堆管存储,栈管运行。也就是说虚拟机栈负责运行代码,虚拟机堆负责存储数据
同时,Java堆也是Java垃圾收集器管理的主要区域,因此也被称为“GC堆”,被GC多管理的对象无法显式的进行销毁
- 从内存回收的角度来看:Java堆可以分为新生代和老生代(新生代和老生代默认占比是1比2)
- 从内存分配的角度来看:线程共享的Java堆中可以划分出多个线程私有的分配缓冲区。不论如何划分都与存放内容无关,无论哪个区域,存储的仍然都是对象实例,进一步划分的目的是为了更好的回收内存或者更快的分配内存
根据Java虚拟机规范的规定,Java堆可以处于物理上的不连续的内存空间中,只要逻辑上是连续

本文详细介绍了Java内存管理机制,特别是JVM的运行时数据区,包括线程共享的方法区和Java堆,以及线程私有的程序计数器、本地方法栈和虚拟机栈。方法区存储类型信息,堆用于对象实例存储,程序计数器记录执行的字节码指令,本地方法栈服务于本地方法,虚拟机栈则包含局部变量表、操作数栈等信息。
最低0.47元/天 解锁文章
104

被折叠的 条评论
为什么被折叠?



