Jvm(27.14.2),理解升级---堆,栈,方法区
看完GC的回收策略之后,我们再来看一下堆,栈,方法区的交互。
首先我们必须牢记一句话,栈是堆和方法区的引用,学的越多对这句话的理解要越深。
1,这里的堆主要是对局部变量表来说的。
2,栈的内存地址是远远小于堆得,因为在栈中只是对象的引用。
3,gc回收只是回收堆内存,不用考虑栈的内存,因为栈的数据结构就是一旦出栈就会释放的。
栈也是JAVA虚拟机自动管理的,(不是由gc)栈类似一个集合(不过是有固定的容量),是由很多元素(专业术语:栈帧)组合起来的,在我们码代码的时候,每调用一个方法,在运行的时候,JAVA虚拟机就会自动在内存中分配对应的一块空间,那么这块空间就是一个
栈帧,也就自然属于栈了,而当方法调用结束后,对应的栈帧就会被释放掉,那么因为
JAVA程序从main方法开始执行,那么JAVA虚拟机就会在内存中分配一块main方法的栈帧,如果main方法里没有调用其它方法,那么,main方法调用结束后,会把main方法栈帧释放掉,此时,栈里没有了栈帧,程序结束。
4,使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
5,堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定。
栈是连续的,所以分配的内存大小要在编译期就确认,大小是固定的
6,堆主要用来存放对象的,栈主要是用来执行程序的
7,(1)堆主要放new的对象,而栈放基本类型和句柄,句柄指向的是堆。
(2)垃圾回收的时候回收的是堆,栈比较难回收,一般不回收(这个才是问你的原因,呵
呵)。
8,栈内存:
程序在栈内存中运行
栈中存的是基本数据类型和堆中对象的引用
栈是运行时的单元
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据
一个线程一个独立的线程栈
堆内存:
程序运行所需的大部分数据保存在堆内存中
堆中存的是对象
堆是存储的单元,堆只是一块共享的内存
堆解决的是数据存储的问题,即数据怎么放,放在哪儿
所有线程共享堆内存
9,局部变量表所需的内存空间在编译期确定,当进入一个方法时,方法在栈帧中所需要分配的局部变量控件是完全确定的,不可动态改变大小。
- Jvm(33),理解升级----有一点豁然开朗的的对堆栈方法区的理解
- JVM 线程工作理解和Java静态方法的线程安全性问题
- 深入理解JVM : class文件结构之类信息描述、字段表、方法表(2)
- Jvm(28),理解升级----java中的基本数据类型一定存储在栈中吗
- Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)
- Jvm(30),理解升级----Java中堆内存和栈内存详解
- 深入理解JVM方法调用的内部机制
- Jvm(31),理解升级----通过JVM内存模型深入理解值传递和引用传递两种方式
- Jvm(32),理解升级----(挺不错的)图解深入理解JVM之JVM内存区域与内存分配
- 理解JVM(2) 栈内存,方法区,堆内存
- Java第三课 Java中包的概念,类的说明符、方法的说明符、对象的销毁(JVM垃圾会受器的演示),Java中接口理解与掌握。
- JVM方法区理解
- 从JVM内存管理的角度谈谈静态方法和静态属性
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
- 关于各种输入输出流的二次理解总结 ,以及输入的三种方法总结。
- Java内存理解 && 反射访问私有属性或方法
- EF5 升级EF6 错误解决方法
- 深入理解Java虚拟机 JVM高级特性与最佳实践-第2版
- 关于各种输入输出流的二次理解总结 ,以及输入的三种方法总结。
- Android View.onMeasure方法的理解