为什么我们要使用堆内存,能否使用栈内存来替代?
编辑
在阅读了回答后,我又想到一个问题: 1)除了堆和栈,还有其他类型的内存可以作为替代吗?
编辑
我了解到了字符串池,那这个内存是与堆内存还是栈内存相关联的?
为什么我们要使用堆内存,能否使用栈内存来替代?
在阅读了回答后,我又想到一个问题: 1)除了堆和栈,还有其他类型的内存可以作为替代吗?
我了解到了字符串池,那这个内存是与堆内存还是栈内存相关联的?
如果想使用对象,就必须使用堆(heap)。对象本质上是指针,在栈(stack)或其他对象内指向堆中内存块。
与C++不同的是,在Java中需要以不同方式处理。即使在C++中,为了让对象超出创建函数生命周期而存在,使用堆也是一个好主意。你可以避免使用堆,但可能会因为所有复制构造函数而导致性能问题。
至于您的编辑:
有没有其他种类的内存可以用作堆和栈的替代品?
当然有:静态数据成员,每个类只有一个而不是每个实例化对象一个的数据成员必须放在某处。这些不能在栈上,因为它们可能在退出函数时消失。它们也不能属于任何特定对象。这些(至少在Sun/Oracle JVM中)放在方法区(method area)中。
此外,您不应认为只有一个栈。每个线程在创建时都有自己的栈。还有用于本地(非Java)调用的常量池和堆栈。
关于JVM内部有很多信息 在这里,但请记住,逻辑机器和实现之间可能会有区别。
堆内存是Java的核心。所有对象都在堆上分配,而局部变量仅保存对它们的引用(基本上是指针)。C#允许您拥有存储在堆栈上的对象(值类型)。Java选择不从C++中借鉴这一点,部分原因是为了简化语言。
跨语言,堆内存是提供任意大小的长寿命对象的方法。
堆内存用于在Java中存储对象。无论对象在代码中是作为成员变量、局部变量还是类变量创建的,它们始终在Java的堆空间内创建。 如果堆栈中没有足够的内存来存储函数调用或局部变量,JVM将抛出java.lang.StackOverFlowError错误, 而如果没有更多的堆空间来创建对象,则JVM将抛出java.lang.OutOfMemoryError Java Heap Space错误。
这样编译器更容易管理大型和/或动态大小的变量-它们在调用堆栈上仍然只占用小的常量存储空间-即4个字节(一个堆指针)。