(2011年java基础)java内存分析(1)----堆和栈

来源:互联网 发布:卫计委大数据 编辑:程序博客网 时间:2024/05/21 11:12




这里就先详述一下自己对java内存机构的认识:



堆(heap)Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存


上面的是来自书中的说法,其实对于我们大部分人来讲,只要知道在java程序中 new出来的对象就是保存在堆内存中已经就可以了

其实堆里面保存的究竟是什么? 

 我以前的理解是:类中的所有代码包括方法,在new的时候都会创造一份分配到堆内存。

但是在看了黑马的内存分析后就发现原来保存的仅仅是对象的成员变量。


那么不禁在想我们平常调用函数的时候究竟是怎样调用的呢?这个问题在讲述到内存的方法区的视频再统一描述


堆内存还有什么呢?

1,对象锁:堆上的对象数据还有一种逻辑部分,那就是对象锁,这是一个互斥对象。虚拟机中的每个对象都有一个对象锁,它被用于协调多个线程访问同一个对象时的同步。

2,垃圾收集数据:在很多书上描述了,垃圾收集器必须以某种方式跟踪程序引用的每个对象,那么按照这样的逻辑推测,在对象中必然有垃圾收集器识别的数据。

栈(stack)是线程私有的,它的生命周期与线程相同。栈描述的是Java方法执行的内存模型,用于存储局部变量表、操作栈、动态链接、方法出口等信息。

栈:其实是一种数据结构。一种后进先出的数据结构,所以有压栈和出栈之分

在数据结构的描述中的栈是:限制仅在表的一段进行插入和删除运算的线性表,插入和删除端为栈顶,另一端为栈底。

理解这个数据结构其实对于认识递归也有很大的好处:



(这是当年学习数据结构递归的时候写的PPT)

图上说明了,函数调用是以压栈方式来进行的,所以对于java的栈空间也不难推测是怎样的结构;

所以方法体内的变量,引用都是在栈空间中生成,而方法体内的对象,则是持有堆空间的引用从栈空间的对象引用中指向堆空间的对象。

而通过以上的图也知道了什么方法结束后方式体内的局部变量会释放的缘故了:因为程序段出栈了,要是不出栈,下面的方式也就不能运行了,因为规定了运行出栈的那一段程序方法。




原创粉丝点击