2016 - 2024

感恩一路有你

深入理解Java内存分配

浏览量:1900 时间:2024-04-01 22:30:00 作者:采采

每当运行一个Java程序时,都会生成一个Java进程,其中可能包含一个或多个线程。每个Java进程对应唯一一个JVM实例,而每个JVM实例又对应唯一的堆,同时每个线程都有自己私有的栈。在Java中,堆内存的分配是自动初始化的,即在为对象分配内存时,会初始化这个对象中的变量。尽管所有对象的存储空间都在堆中进行分配,但对象的引用却是在栈中分配。接下来我们来详细了解一下Java如何进行内存分配。

JVM内存划分概念

JVM的内存可分为三个区域:堆(heap)、栈(stack)和方法区(method,也称为静态区)。JVM将其内存划分为五个区域:

  1. 寄存器:用于内存和CPU之间的通信。
  2. 本地方法栈:用于JVM调用系统功能。
  3. 方法和数据共享:运行时期class文件所在位置。
  4. 方法栈:存储所有方法运行时期的内存。
  5. 堆(heap):用于存储容器和对象。

堆区

在堆区存储的全部是对象,每个对象都包含一个与之对应的class信息,而class的目的是获取操作指令。JVM只有一个堆区,并且被所有线程共享。堆中不存放基本类型和对象引用,而是仅存放对象本身和数组本身。

栈区

每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用。栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。栈分为三个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区(静态区)

方法区被所有线程共享,其中包含所有的class(类的原始代码,在创建类的对象时,需要将该类的代码加载到方法区并进行初始化)和static变量。方法区中包含的元素在整个程序中都是唯一的,如class和static变量。

Java虚拟机启动过程

当运行Java程序时,首先会启动一个Java虚拟机进程。该进程会从classpath中找到相应的.class文件,读取其中的二进制数据,并将类信息存储到方法区中,这便是类的加载过程。随后,Java虚拟机定位到方法区中相应类的方法字节码,开始执行指令。在main()方法中,第一条语句即可开始执行。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。