(2011年java基础)java内存分析(1)----堆和栈
来源:互联网 发布:卫计委大数据 编辑:程序博客网 时间:2024/05/21 11:12
这里就先详述一下自己对java内存机构的认识:
堆(heap):Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存
上面的是来自书中的说法,其实对于我们大部分人来讲,只要知道在java程序中 new出来的对象就是保存在堆内存中已经就可以了
其实堆里面保存的究竟是什么?
我以前的理解是:类中的所有代码包括方法,在new的时候都会创造一份分配到堆内存。
但是在看了黑马的内存分析后就发现原来保存的仅仅是对象的成员变量。
那么不禁在想我们平常调用函数的时候究竟是怎样调用的呢?这个问题在讲述到内存的方法区的视频再统一描述
堆内存还有什么呢?
1,对象锁:堆上的对象数据还有一种逻辑部分,那就是对象锁,这是一个互斥对象。虚拟机中的每个对象都有一个对象锁,它被用于协调多个线程访问同一个对象时的同步。
2,垃圾收集数据:在很多书上描述了,垃圾收集器必须以某种方式跟踪程序引用的每个对象,那么按照这样的逻辑推测,在对象中必然有垃圾收集器识别的数据。
栈(stack):是线程私有的,它的生命周期与线程相同。栈描述的是Java方法执行的内存模型,用于存储局部变量表、操作栈、动态链接、方法出口等信息。
栈:其实是一种数据结构。一种后进先出的数据结构,所以有压栈和出栈之分
在数据结构的描述中的栈是:限制仅在表的一段进行插入和删除运算的线性表,插入和删除端为栈顶,另一端为栈底。
理解这个数据结构其实对于认识递归也有很大的好处:
(这是当年学习数据结构递归的时候写的PPT)
图上说明了,函数调用是以压栈方式来进行的,所以对于java的栈空间也不难推测是怎样的结构;
所以方法体内的变量,引用都是在栈空间中生成,而方法体内的对象,则是持有堆空间的引用从栈空间的对象引用中指向堆空间的对象。
而通过以上的图也知道了什么方法结束后方式体内的局部变量会释放的缘故了:因为程序段出栈了,要是不出栈,下面的方式也就不能运行了,因为规定了运行出栈的那一段程序方法。
- (2011年java基础)java内存分析(1)----堆和栈
- java基础:栈内存和堆内存
- Java堆内存和栈内存分析
- Java基础7(栈内存和堆内存)
- java内存分析,栈内存,堆内存
- java堆、栈、内存分析
- java堆、栈、内存分析.
- java堆、栈、内存分析
- java堆、栈、内存分析
- Java堆、栈、内存分析
- Java堆、栈、内存分析
- Java 堆、栈、内存分析
- java内存分配分析 及堆、栈和队列分析
- java堆内存分析
- java 堆内存的转换和分析
- Java 堆内存 和日志分析
- 关于java中的内存分析-堆和栈【收集资料】
- java 内存机制(堆和栈)
- AP和 BP的工作原理
- 把二元查找树转变成排序的双向链表
- Win7 VMware安装ubuntu网络配置联网
- Apache曝HashTable碰撞拒绝服务漏洞,Java、PHP、Asp.Net及v8引擎等都受影响
- iPhone开发笔记(3)关闭arc
- (2011年java基础)java内存分析(1)----堆和栈
- 自己编译Android gdbserver(解决运行 gdbserver时 Segmentation fault 问题)
- Java编译错误“No enclosing instance of type AA is accessible. Must qualify the allocation with an enclosi
- EXTJS 2.2版本在IE9中会报错:对象不支持“createContextualFragment”属性或方法
- About 异步编程
- 安装iis5.1时找不到zClientm.exe的解决方法
- Web数据挖掘综述
- ubuntu下vim的配置和改造
- C++层Service的创建与使用