我一直在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?
答案 0 :(得分:0)
StringBuilder
变量,用于构建方法的返回值。您永远不会在自己的方法之外传递它,并且在方法结束时调用stringBuilder().toString()
来创建一个新对象。由于Java可以告诉StringBuilder
对象不会超过方法的运行,因此它可以将它放在堆栈上并在方法返回时立即解除分配,而不是将其传递给垃圾收集器。答案 1 :(得分:0)
通过固定在创建它的位置来控制堆栈大小。如果您尝试使用比堆栈上可用空间更多的空间,则会出现“堆栈溢出”异常。
答案 2 :(得分:0)
堆栈是内存的一部分。在此堆栈上创建本地自动变量,并传递方法参数。当进程启动时,它会获得一个默认的堆栈大小,该大小对于每个进程都是固定的。在今天的操作系统中,通常,默认堆栈大小为1 Mb,这对于大多数进程来说已经足够了。在异常情况下,堆栈限制超过。这称为堆栈溢出。