gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:52:30 25 4
gpt4 key购买 nike

我一直在研究java(jdk 6 hot spot JVM)中的垃圾回收。我有一些问题希望社区能帮助我解决。

我的理解:

1)堆分为

a)Young generation -Eden and Survivor :New objects and arrays are created into the young generation.Minor garbage collection will operate in the young generation. Objects, that are still alive, will be moved from the eden space to the survivor space.

b)Old generation/Tenured Generation:Major collection will move the still alive objects from young generation to old generation.

2)Non Heap分为

    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?

最佳答案

  1. 当幸存者空间满时,对象被移动到老年代。尽管从技术上讲,大多数情况下,当一个对象从幸存者空间移动到老年代时,并不是因为幸存者空间已满,而是因为该对象已经经历了一定数量的次要收集,通常是 10-15 次。
  2. 很少。它主要是Java类的二进制代码,所以只有从内存中卸载一堆类才能释放空间。大多数程序在整个程序生命周期中都使用同一套类,因此收集永久代通常是浪费时间。基本上,Java 只会在内存即将耗尽时才会在这里进行收集。
  3. 栈是堆之外的东西,它的大小是由这样一个事实控制的,即对象只有在保证它们的生命周期有限的情况下才会存储在栈上。这些主要是局部变量。假设您有一个本地 StringBuilder 变量,用于构建方法的返回值。您永远不会将它传递到您自己的方法之外,并且您调用 stringBuilder().toString() 以在该方法的末尾创建一个新对象。由于 Java 可以判断 StringBuilder 对象不会比方法的运行时间长,因此它可以将它放在堆栈上并在方法返回时立即释放它,而不是将它传递给垃圾收集器。

关于java - 堆,非堆和堆栈..垃圾收集的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com