Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 年轻、终身和烫发一代_Java_Garbage Collection_Jvm_Heap Memory - Fatal编程技术网

Java 年轻、终身和烫发一代

Java 年轻、终身和烫发一代,java,garbage-collection,jvm,heap-memory,Java,Garbage Collection,Jvm,Heap Memory,我对Heap、Young、Tenured和Perm世代感到困惑 有人能解释一下吗?堆中的所有对象在被引用时都会继续存在。当它们不多时,垃圾收集器(GC)将回收它们的内存 PermGen、Young和Tenured是对象的不同分类(或堆中的空间) PermGen:这些对象将始终存在,它们不会被垃圾收集。类对象、插入的字符串等等。我不知道是否有GC(当系统卸载类时…但这不是正常的事情) Young:创建对象时,它就在这里 Tenured:当对象在N次GC过程中幸存时(幸存=GC过程,但该对象被引用,

我对Heap、Young、Tenured和Perm世代感到困惑


有人能解释一下吗?

堆中的所有对象在被引用时都会继续存在。当它们不多时,垃圾收集器(GC)将回收它们的内存

PermGen、Young和Tenured是对象的不同分类(或堆中的空间)

PermGen:这些对象将始终存在,它们不会被垃圾收集。类对象、插入的字符串等等。我不知道是否有GC(当系统卸载类时…但这不是正常的事情)

Young:创建对象时,它就在这里

Tenured:当对象在N次GC过程中幸存时(幸存=GC过程,但该对象被引用,因此无法回收),该对象将进入该分类/类别

根据使用的GC和一些参数化,GC传递的次数或多或少


然后,垃圾收集可以有不同的方法来处理堆中的maange对象。对象的这种分类有助于做到这一点。

Java垃圾收集器被称为分代垃圾收集器。应用程序中的对象根据创建位置和使用方式的不同而存在不同的时间长度。这里的关键洞察是,对短生命周期和长生命周期对象使用不同的垃圾收集策略,可以针对每种情况专门优化GC

不严格地说,当对象在年轻一代的重复垃圾收集中“存活”下来时,它们被迁移到终身一代。永久生成是一种特殊情况,它包含JVM所需的对象,这些对象不一定在程序中表示,例如表示类和方法的对象

由于年轻一代通常会在其中包含大量垃圾,因此它被优化为一次清除大量未使用的对象。由于包含寿命较长的对象,因此对终身生成进行了优化,以便在不浪费大量内存的情况下快速收集垃圾

随着垃圾收集技术的改进,细节变得相当复杂,并且根据JVM及其配置方式而有所不同。如果您需要确切了解正在发生的事情,那么应该阅读您正在使用的特定JVM的

这就是说,有一个简单的历史安排,这在概念层面上仍然有用。从历史上看,年轻一代是一代,终身一代是一代。拷贝收集器基本上不为清除垃圾支付CPU成本,大部分成本用于维护活动对象,这种效率的代价是更大的内存使用量。标记和扫描收集器为活动对象和未使用的对象支付一些CPU成本,但更有效地利用内存。

下面是另一篇关于如何调整GC参数的优秀文章(虽然很长),这可能会帮助您更好地理解:

如果您遇到GC问题,需要了解如何读取GC日志,或者需要了解当前GC收集器的工作方式,那么这是一个非常有用的读物

如果要连接对正在运行的系统的远程监控,以查看实时内存使用情况和GC运行,请检查此工具:

Java堆内存是操作系统分配给JVM的内存的一部分。无论何时我们创建对象,它们都是在内部创建的

Java堆空间为了进行垃圾收集,分为三个区域或三代,即年轻一代、老一代或终身一代和永久一代。永久生成是在热点JVM中的完全gc期间进行垃圾收集的

年轻一代是分配和老化所有新对象的地方。当年轻一代填满时,这会导致较小的垃圾收集。年轻一代的尸体很快就被收集起来了。一些幸存下来的物体会老化,最终会转移到老一代

旧一代用于存储长期存活的对象。通常,会为年轻一代对象设置一个阈值,当满足该年龄时,对象将移动到老一代。最终老一代需要被收集起来。此事件称为主要垃圾回收

永久生成包含JVM描述应用程序中使用的类和方法所需的元数据。JVM在运行时根据应用程序使用的类填充永久生成

PermGen自Java8发布以来已被Metaspace取代。PermSize&MaxPermSize参数现在将被忽略。看看皮埃尔·胡格斯·夏博诺的这篇文章,了解元空间

图像来源:


有关更多详细信息,请参阅同一篇文章。

如果您真的喜欢这种内存管理方式,请阅读Fortega的建议。perm generation中驻留了什么类型的对象?我已经澄清了有关永久生成的答案。基本上,JVM需要一些自己的对象来管理应用程序。这些对象通常不会直接用于应用程序代码中。永久生成中的对象从不被垃圾收集,因此命名为。@TendayiMawushe在您的答案中添加上述两个链接的概要将非常有用,因为这些链接将来可能会断开。非常好。我可以知道此图片中方法区域、nativestack和运行时常量池的位置吗?它们相应地持有什么?有关更多详细信息,请参阅。方法区域是在虚拟机启动时创建的。尽管方法区域在逻辑上是堆的一部分,但简单的实现可能选择不进行垃圾收集或压缩。每个运行时常量池都是从Java虚拟机的方法区域分配的