dha*_*ram 4 java callstack memory-management
这可能听起来很愚蠢,但我仍然不清楚Java Stack和内存堆.我从学习中得知的是:
1)所有方法调用都在堆栈上进行.
2)本地分配的所有内存都在内存堆上(关于这一点不是很清楚)
3)新运算符(在方法或类中)分配的所有内存都在内存堆上.
我担心以下情况:
1)如果我在方法中创建一个int变量并返回它,它会去哪里(我相信它会进入堆栈,但需要澄清).
2)如果我在方法中创建一个新对象,即使在方法执行结束后它仍然存在于堆内存中(我明白这是因为当我将这个对象分配给某些对象时,由java创建的对象的哈希码保持不变外部引用变量或我返回此对象).
3)我的问题是如果我没有将第2点中提到的对象分配给任何引用或者我没有返回它,会发生什么.它仍然是在堆上创建的吗?逻辑上它应该但请赐教.
所有方法参数都在堆栈中.所有局部变量都在堆栈上.堆中唯一的东西是显式使用new(或通过自动装箱或varargs隐式)分配的东西.
考虑它的另一种方法是原始值和对象/数组引用可以在堆栈上,但实际对象不能1.
所以:
1) - 你正在返回一个原始值(不是一个变量!),它会进入堆栈.(你不能"返回"一个变量.变量是堆栈框架的一部分,不能与它分离.)
2)是的.
3)是的,至少现在1.在某些时候,GC可能会运行,注意应用程序不再引用该对象,并回收它.
1 - 实际上,最新的Hotspot编译器能够检测到对象的引用永远不会从创建它的方法中"逃脱",并且可以在堆栈上分配对象.IIRC,需要使用JVM命令行标志启用此优化(称为转义分析).
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |