代码之家  ›  专栏  ›  技术社区  ›  gmhk

为什么在Java中使用堆内存

  •  6
  • gmhk  · 技术社区  · 14 年前


    编辑

    读完答案后,我又想到了一个问题 1) 有没有其他类型的内存可以替代堆和堆栈?


    编辑

    我遇到了字符串池,内存是与堆还是堆栈相关联?

    7 回复  |  直到 14 年前
        1
  •  12
  •   paxdiablo    14 年前

    如果要使用对象,请使用堆。对象本身就是堆栈(或其他对象内部)上指向堆中内存块的指针。

    与C++不同,可以在堆栈上放置对象 堆,Java做的事情不同。

    即使在C++中,使用堆必须比它们所创建的函数更长的功能也是一个好主意。你可能 避免这种情况,但是您可能会发现所有复制构造函数都存在性能问题。


    至于你的编辑:

    有没有其他类型的内存可以替代堆和堆栈?

    当然有:静态数据成员,即每个类只有一个成员而不是每个实例化对象只有一个成员的成员必须存在。它们不能在堆栈上,因为当您退出函数时它们可能会消失。它们不可能属于某个特定的物体。

    这些(至少在Sun/oraclejvm中)进入方法区域。

    此外,您不应该认为有一个堆栈。每个线程在创建时都有自己的堆栈。

    还有用于本机(非Java)调用的运行时常量池和堆栈。

    有很多关于JVM内部的信息 here 关于这一方面,但请记住,逻辑机和实现之间可能存在区别。

        2
  •  2
  •   Matthew Flaschen    14 年前

    跨语言,堆内存是提供任意大小的长寿命对象的方法。

        3
  •  2
  •   Stephen C    14 年前

    基本上没有。

    在Java中,堆栈内存仅用于方法的参数和局部变量(以及一些与本讨论无关的隐藏簿记信息)。对于这些变量,只有基元类型使用堆栈内存。任何对象或数组都表示为对堆上某个对象的引用,而Java不提供在堆栈上分配对象或数组的方法。

    [旁白:从理论上讲,只使用原语类型和递归静态方法就可以在Java中执行任何计算。然而,这将是可怕的混乱。即使向控制台写入一条简单的消息,也会导致应用程序在堆上分配对象。所以我们可以认为这是完全不切实际的。]

        4
  •  1
  •   Peter Lawrey    14 年前

        5
  •  1
  •   Praveen Kumar Verma    9 年前

    堆内存用于在Java中存储对象。不管在哪里,对象都是在代码中创建的。 如果堆栈中没有剩余内存用于存储函数调用或局部变量,JVM将抛出java.lang.StackOverflowerError, java.lang.OutOfMemoryError java堆空间。

        6
  •  0
  •   Maddy    14 年前

        7
  •  0
  •   Nikhil Garg    14 年前

    它使编译器更容易管理大型/或者动态大小的变量—它们仍然在调用堆栈上使用小的常量存储—即4字节(一个堆指针)。