这可能看起来很多问题,但它们都是相互关联的。我很困惑,因为分配的堆空间在哪里以及堆栈内存位于何处?
如果两者都存在于主存储器中那么为什么说堆栈存储器更容易访问?为什么我们不能在堆栈存储器中分配对象?
由于类存储在PermGen中,在这里分配了这个空间,它与堆空间有什么不同以及存储常量字符串的位置?
答案 0 :(得分:4)
答案 1 :(得分:2)
如果两者都存在于主存储器中,那么为什么说堆栈存储器更容易访问
访问速度和分配速度。堆栈分配(如在alloca
中)很快,因为不需要搜索未使用的内存块。但是Java不允许堆栈分配,除非你计算新堆栈帧的分配。
访问堆栈内存很快,因为它往往会被缓存。不仅当地人彼此靠近,他们也非常紧凑地存放。
为什么我们不能在堆栈内存中分配对象?
这很有用,但很危险。用户可以在堆栈上分配一个对象,从永久对象创建对它的引用,然后在关联的堆栈帧消失后尝试访问该对象。
将原语存储在堆栈上是安全的,因为我们无法从其他地方创建对它们的引用。
由于类存储在PermGen中,分配了这个空间,它与堆空间有什么不同,存储常量字符串的位置是什么?
PermGen只是另一个堆空间。字符串文字存储在文字池中,文字池只是内存中的一个表,在加载类时会分配。