当前位置:首页 > 内存 > 正文

java基本类型内存分配

  • 内存
  • 2024-07-04 09:33:32
  • 701

一、Java内存区域划分、内存分配原理是什么?

Java虚拟机运行Java程序时,会将其管理的内存划分为几个不同的数据区域。这些区域有自己的目标,以及创建和破坏的时间。有些区域随着虚拟机进程的启动而存在,有些区域根据用户线程开始和结束销毁的时间创建和销毁。根据《Java虚拟机规范(第2版)》

Java虚拟机管理的内存将包括以下运行时数据区域,如下:


二、java内存模型的java对象的内存分配(1)注册。这是最快的保存区域,主要是由于它位于处理器内部。然而,寄存器的数量非常有限,因此寄存器必须由编译器分配。我们对此没有直接控制权,并且不可能在我们的程序中找到寄存器存在的任何痕迹。
(2)堆栈。位于通用RAM(随机存取存储器)中。通过“堆栈指示器”可以直接支持处理。向下移动堆栈指针会创建新的内存;这是一种非常快速有效的数据存储方式,仅次于注册。创建程序时,Java编译器必须准确地知道存储在堆栈上的所有数据的“长度”和“存在时间”。这是因为它需要生成适当的代码来上下移动指针。这种限制无疑影响了程序的灵活性,因此虽然栈上存储了一些Java数据——主要是对象句柄(也称为对象引用),但Java对象却没有放在上面。
(3)堆栈。存储Java对象的通用内存池(也在RAM区域)。与堆不同,“内存堆”或“堆”最有趣的地方在于,编译器不需要知道从堆中分配多少存储空间,也不需要知道存储的数据会停留多长时间在堆上。因此,使用堆存储数据时您将获得更大的灵活性。当需要创建对象时,只需要使用new命令编译相关代码即可。当执行此代码时,数据将自动保存在堆上。当然,实现这种灵活性是有代价的。在堆上分配存储空间会花费更长的时间!
(4)静态存储(staticstorage)。这里的“静态”意味着“位于固定位置”(即使它也在RAM中)。程序运行时,静态存储的数据会随时等待调用。您可以使用static关键字来指示对象的某些元素是静态的。但Java对象本身永远不会放置在静态存储空间中。
(5)Constantstorage(常量存储)。常量值通常直接放在程序代码中。这些是安全的,因为它们永远不会改变。
(6)Non-RAM存储(RAM不是存储)。如果数据真正独立于程序,那么它可以在程序不运行时存在并且不受程序控制。最重要的两个例子是“流对象”和“固定对象”。对于流对象,对象被转换为字节流,通常发送到另一台机器。对于持久对象,对象存储在磁盘上。即使计划终止,他们仍然可以保持其状态。对于这种类型的数据存储来说,一个非常有用的技巧是它可以存在于其他介质中。如果需要,它们还可以恢复为普通的基于RAM的对象。Java1.1提供了对轻量级持久化的支持。未来的版本可能会提供更完整的解决方案。