JVM详细介绍——运行时数据区

目录

1.Java内存管理机制

 2.运行时数据区

 2.1方法区(Method Area)—线程共享

2.2Java堆(Java Heap)—线程共享

  2.2.1 新生代

  2.2.2 老生代

2.3 程序计数器(Program Counter Register)—线程私有

2.3.1 线程并发执行

 2.4 本地方法栈(Native Method Stack)—线程私有

 2.4.1 为什么要使用本地方法

2.5 虚拟机栈(Virtual Machine Stacks)—线程私有

2.5.1 栈帧

 2.5.2 局部变量表

2.5.3 操作数栈

2.5.4 动态链接 

2.5.5 方法出口


1.Java内存管理机制

Java语言之所以可以霸占企业级开发很多年,就是因为Java有一套内存管理机制

 2.运行时数据区

在程序执行过程中,JVM会用一段空间来存储程序执行期间常用的数据和信息,这一段内存空间被称为运行时数据区(Runtime Data Area),就是经常说了JVM内存,而我们常说的内存管理就是针对这一段空间来进行的,而运行时数据区被分为五个部分,如下图所示JVM详细介绍——运行时数据区_第1张图片

 每一个线程都会独立开辟私有的程序计数器,本地方法栈,虚拟机栈,因此这些组件的生命周期和线程的生命周期一致

而方法区和堆并不是独立开辟的,是所有线程共享的

 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堆可以处于物理上的不连续的内存空间中,只要逻辑上是连续

你可能感兴趣的:(jvm,java,开发语言)