java程序运行时的数据存放、内存分配

记录一下,java程序运行时,数据是怎么存放的,内存是怎么分配的。

首先思考一下,程序在运行时,无非就是有一堆的成员变量(全局变量)、局部变量、常量、基本类型、对象、流对象、持久化对象在内存中各种操作。

现在确定一下,它们都各自存在的什么地方。

有五个不同的地方可以存储这些数据:

1.寄存器,这个是大佬,它不同与其他存储区,它是位于处理器(CPU)内部的,速度也是最快的,但是大佬毕竟是大佬,数量极其有限,并且不能直接控制,在程序中也很难感觉到它的存在,只能按需求进行分配,所以很难知道java的啥数据会放里运行。

2.堆栈(栈),这个是二哥吧,它位于通用的随机访问存储器(RAM),可以通过堆栈指针从处理器里获取支持。堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。这是一种快速有效的分配存储的方法,速度仅次于大佬寄存器。java程序运行时,必须知道存储在堆栈内的所有项的生命周期,以便可以上线移动堆栈指针操作内存,所以我们自然而然的想到,java的什么数据是有很明确的生命周期的,那肯定是局部变量呀,然后又因为基本类型是一种特别小而简单的变量,所以也存在堆栈中,还有一个就是加载方法时的帧(实例化对象时,对象里只保存自己的成员变量,并不保存成员方法,类的方法是该类的所有对象共享的,只有对象使用方法的时候方法才被压入栈,方法不使用则不占用内存

3.,这个是三哥吧,称它为一种通用的内存池,也是位于RAM内,存放所有的java对象,与二哥栈不同的是,编译器不需要知道存储的数据在堆中存活的时间,因此也有很大的灵活性。只要你new,我就分配内存给你。但是付出的代价也是有的,比二哥栈需要更多的时间来分配内存和清理内存。(注意,对象里只存成员变量,不存成员方法

4.常量存储(常量池)这个是四哥吧。因为常量是永远不会被改变的,所以通常它们是直接放在程序代码内部,这样做是安全的。JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合

5.静态存储这个是五哥吧,这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的,不管有多少个对象,static标记的变量/方法在整个内存里只有一个。但 Java 对象本身永远都不会置入静态存储空间

6.非RAM存储,这个是六哥吧,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象” 。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于 RAM 的对象。

参考《java编程思想》

这只是基本的内存分配,涉及JVM更深的,这里还未涉及,如有错误,请各位大神指教


猜你喜欢

转载自blog.csdn.net/ouyzc/article/details/79724242