堆,非堆和堆栈..垃圾收集的复杂性

时间:2014-02-25 06:05:32

标签: java performance garbage-collection jvm-hotspot

我一直在java(jdk 6热点JVM)中进行垃圾收集。我几乎没有问题希望社区能帮我解决。

我的理解:

1)堆分为

  

a)年轻一代--Eden和Survivor:新对象和数组   创造了年轻一代.Minor垃圾收集将   在年轻一代经营。仍然活着的物体会   从伊甸园空间移到幸存者空间。

     b)老一代/终身代:主要的收藏品将把年轻一代的活物搬到老一代。

2)非堆分为

    a)Code Cache
    b)Perm generation.

我想知道的事情:

1)what if survivor gets full..how will minor garbage collection work.

2)When and how is the perm generation garbage collected.
3)Also what happens to the stack..where is it stored or residing?How is its size controlled?

3 个答案:

答案 0 :(得分:0)

  1. 当幸存者空间已满时,物体会移动到旧一代。虽然从技术上讲,大多数情况下,当一个物体从幸存者空间移动到老一代时,并不是因为幸存者空间已满,而是因为该物体存活了一定数量的次要集合,通常是10-15。 / LI>
  2. 很少。它主要是Java类的二进制代码,因此只有在从内存中卸载一堆类时才能释放空间。大多数程序在程序的整个生命周期中使用相同的类集,因此收集永久代数通常是浪费时间。基本上,如果Java即将耗尽内存,它将只在这里进行收集。
  3. 堆栈是堆外的东西,它的大小由对象只保存在有限的生命周期中的事实控制。这些主要是局部变量。假设您有一个本地StringBuilder变量,用于构建方法的返回值。您永远不会在自己的方法之外传递它,并且在方法结束时调用stringBuilder().toString()来创建一个新对象。由于Java可以告诉StringBuilder对象不会超过方法的运行,因此它可以将它放在堆栈上并在方法返回时立即解除分配,而不是将其传递给垃圾收集器。

答案 1 :(得分:0)

通过固定在创建它的位置来控制堆栈大小。如果您尝试使用比堆栈上可用空间更多的空间,则会出现“堆栈溢出”异常。

答案 2 :(得分:0)

堆栈是内存的一部分。在此堆栈上创建本地自动变量,并传递方法参数。当进程启动时,它会获得一个默认的堆栈大小,该大小对于每个进程都是固定的。在今天的操作系统中,通常,默认堆栈大小为1 Mb,这对于大多数进程来说已经足够了。在异常情况下,堆栈限制超过。这称为堆栈溢出。