java高级-堆和栈
图
1. java堆 /栈
1.Java程序运行时的内存分配策略
1.静态存储区(方法区):主要存放静态数据,全局static数据和常量。程序编译时分配好
2.栈区:方法体内的局部变量都在栈上创建
方法在执行时,方法体内的局部变量会在栈上创建局部内存区,并在方法结束时,这个局部变量所持有的内存将会被自动释放,因此栈内存分配运算内置于处理器的指令集中,效率很高,容量有限
3.堆区:动态内存分配区。通常就是指在程序运行时直接new 出来的内存,这些内存在不运行时,会被java回收机制回收
2. 栈内存 / 堆内存的区别
1.从内存分配角度
在方法体内定义的(局部变量)一些基本类型的变量和对象引用变量都是在方法的栈内存中分配的。
堆内存用来存放所有由new 创建的对象(包括该对象其中的所有成员数量)和数组。在堆中分配的内存,将由java垃圾回收期来自动管理。
3.Java内存回收机制
图:
4.Java内存泄露引起的原因
无用对象持续使用内存,得不到释放
长生命周期的对象持有短生命周期的引用
总结:
堆:运行时,垃圾回收,动态分配内存,存取速度(相对慢些,动态分配)
栈:存取速度,生命周期是绑定的,栈区的数据可以共享
网友评论