Java对象内存分配详解:从堆栈到持久化存储

创始人
2025-01-01 15:34:22
0 次浏览
0 评论

一个Java对象到底占用多大内存

Object=newObject():在Java中,nullobject占8个字节,object占4个字节。
所以上面提到的空间占用了4byte+8byte=12byte。
占用内存大小为空对象(8)+int(4)+byte(1)+String引用(4)=17个字节,因为它是另一个,也包含在别人的空间中。

java内存模型的java对象的内存分配

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

热门文章
1
Java字符串分割技巧:轻松获取逗号前的... java任意一个字符串,当它碰到第一个逗号时,返回逗号前面的字符串,例如:str...

2
SQL多表连接查询全解析:JOIN语句应... sql多表关联查询在执行SQL多表连接查询时,可以使用JOIN语句将多个表连接在...

3
Java中字符串类型详解:String与... 变量有字符类型,为什么没有字符串类型??基本类型:charshort、int、l...

4
JavaSE与JavaEE:从基础到企业... javase 和javaee的区别?JavaSE和JavaEE...

5
Java程序员面试必知:核心技术问答与技... java编程程序员技术面试常见面试?随着互联网的不断发展,Java开发已经成为很...

6
Java.exe与Javaw.exe:区... 程序中java和javaw有什么区别java和javaw的区别:两者都是Java...

7
深入解析:Java中的javax包及其与... JAVA导入时,什么是javax?awt是java1.0,swing是java2...

8
Java包基础:命名空间与代码组织指南 java中的包是什么意思?包是Java中组织代码的基本结构。这种结构可以帮助我们...

9
Java AWT与Swing:全面解析二... java.awt和javax.swing有什么区别AWT是AbstractWin...

10
Java字符串比较:如何检测子字符串在另... java怎样判断一个字符串中的某个字符或字符串包含于另一个字符串publiccl...