1
12
有 如果要使用对象,请使用堆。对象本身就是堆栈(或其他对象内部)上指向堆中内存块的指针。 与C++不同,可以在堆栈上放置对象 或 堆,Java做的事情不同。 即使在C++中,使用堆必须比它们所创建的函数更长的功能也是一个好主意。你可能 避免这种情况,但是您可能会发现所有复制构造函数都存在性能问题。 至于你的编辑:
当然有:静态数据成员,即每个类只有一个成员而不是每个实例化对象只有一个成员的成员必须存在。它们不能在堆栈上,因为当您退出函数时它们可能会消失。它们不可能属于某个特定的物体。 这些(至少在Sun/oraclejvm中)进入方法区域。 此外,您不应该认为有一个堆栈。每个线程在创建时都有自己的堆栈。 还有用于本机(非Java)调用的运行时常量池和堆栈。 有很多关于JVM内部的信息 here 关于这一方面,但请记住,逻辑机和实现之间可能存在区别。 |
2
2
跨语言,堆内存是提供任意大小的长寿命对象的方法。 |
3
2
基本上没有。 在Java中,堆栈内存仅用于方法的参数和局部变量(以及一些与本讨论无关的隐藏簿记信息)。对于这些变量,只有基元类型使用堆栈内存。任何对象或数组都表示为对堆上某个对象的引用,而Java不提供在堆栈上分配对象或数组的方法。 [旁白:从理论上讲,只使用原语类型和递归静态方法就可以在Java中执行任何计算。然而,这将是可怕的混乱。即使向控制台写入一条简单的消息,也会导致应用程序在堆上分配对象。所以我们可以认为这是完全不切实际的。] |
4
1
|
5
1
堆内存用于在Java中存储对象。不管在哪里,对象都是在代码中创建的。 如果堆栈中没有剩余内存用于存储函数调用或局部变量,JVM将抛出java.lang.StackOverflowerError, java.lang.OutOfMemoryError java堆空间。 |
6
0
|
7
0
它使编译器更容易管理大型/或者动态大小的变量—它们仍然在调用堆栈上使用小的常量存储—即4字节(一个堆指针)。 |
NOBUD · 最大堆插入函数实现C++ 2 年前 |
JimBelushi2 · 合并排序创建内存堆 6 年前 |
Arda Ä°brahim Gökçe · 在遍历最小堆时获取垃圾值 6 年前 |
Alexy Grabov · 查找最大堆中k个最大元素的位置 6 年前 |
Maxxx · 使用堆在O(N log K)时间内查找前K个元素 6 年前 |
Karthik · 限制Go堆接口实现的优先级队列的大小 6 年前 |
mourinho · 使用数组实现最小堆[关闭] 6 年前 |