Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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 热点JVM垃圾收集器_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 热点JVM垃圾收集器

Java 热点JVM垃圾收集器,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我对Java相当陌生,我想知道HotSpot JVM垃圾收集器的不同版本的结构和垃圾收集过程的原理。我主要对Java 1.6、1.7和1.8中使用的垃圾收集过程感兴趣,但不幸的是,我找不到一个广泛的源代码来在Java中涵盖这个主题 你能给我推荐一些参考资料吗?在那里我可以阅读更多关于HotSpot JVM垃圾收集器不同版本的信息 永久生成段是JVM堆的一部分吗? Oracle OBE教程说它是: 堆的部分是:年轻一代、老一代或终身一代以及永久一代 但MarkNelson分别谈到了永久性生成和堆

我对Java相当陌生,我想知道HotSpot JVM垃圾收集器的不同版本的结构和垃圾收集过程的原理。我主要对Java 1.6、1.7和1.8中使用的垃圾收集过程感兴趣,但不幸的是,我找不到一个广泛的源代码来在Java中涵盖这个主题

你能给我推荐一些参考资料吗?在那里我可以阅读更多关于HotSpot JVM垃圾收集器不同版本的信息

永久生成段是JVM堆的一部分吗? Oracle OBE教程说它是: 堆的部分是:年轻一代、老一代或终身一代以及永久一代 但MarkNelson分别谈到了永久性生成和堆

字符串文本存储在堆中,而不是从1.7Java版本开始的永久生成中,这是真的吗

JVM中的原语存储在哪里?它是堆还是永久的一代

JVM中的常量存储在哪里?它是堆还是永久的一代?
这个链接有点旧,但我希望它能有所帮助

也可能要检查一下


最后一篇文章在为JVM挖掘各种东西时帮了我很大的忙,不管怎样,这是一本不错的读物。

Java中有多个垃圾收集器;但最受欢迎的研究是伊甸园和衰老模型

当然,现在大多数人都在运行G1垃圾收集器,即使是那个流行的模型也常常无法描述真正发生的事情。不要太担心不准确,对于相当多的版本来说,这是事实上的违约

垃圾收集是两个主要任务,回收内存和压缩漏洞

首先从概念上回收内存。如果JVM无法从非死线程访问对象,那么对象将被回收,因为它将来无法成为执行程序的一部分。。。对象句柄/地址的知识已永久丢失。 一旦对象被回收,它们就会使堆处于瑞士奶酪状态,一些区域正在使用,而其他区域由于回收而为空。压缩尝试移除堆中的漏洞,其方式是尝试分配大型对象不会失败,因为请求的内存不能作为连续的一系列地址使用。 对于旧的伊甸园式垃圾收集器,想法是

新创建的对象回收的风险更高,因为它们可能是在块的范围内创建的,退出块时引用可能会丢失。 新创建的对象越少,回收的风险越低,因为它们在创建它们的块中幸存下来。 因此,eden空间是堆的一部分,在堆中尚未检查对象,以查看JVM程序执行线程是否仍然可以访问该对象。幸存者空间是将对象复制到副本中的空间,允许重新建立地址的基础,从而进行压缩,而其他更永久的空间则表示对象的寿命更长


现在有了新的G1垃圾收集器,实际上有数千到数百万个小堆,整个堆根据其包含的对象的生存性进行标记。压缩有时通过组合两个堆块来完成;但是,由于堆小得多,它们通常被丢弃而不是压缩,因为当考虑的对象较少时,堆中的所有对象都很可能无法访问。

请注意,当堆使用量不足一半时,它们的默认算法通常是复制和扫描,这大致意味着,当我检测到正在使用的对象时,我将其复制到内存的另一半,检测完成后,我将旧的一半扫干净。该过程重复回到扫掠侧。尽管有拷贝,但由于压缩方法的简单性,它有一些明显的性能优势。非常感谢。但是你能告诉我,所有的常量和字符串文本都存储在JVM中的什么地方吗?说perm gen是JVM堆的一部分是正确的吗?大多数真正的文本最初是在.class文件的常量池中定义的。Perm gen并不是堆的一部分,因为一旦它进入Perm gen,就无法真正回收。然而,在Java8中,perm gen中存储的内容现在存储在堆中,理论上可以回收,只是当它到达永久生成时,还不清楚何时回收它是合适的。如果JVM决定解包类并将所有常量内部化到一个中心位置,这是JVM的一个实现细节,而不是一个要求。请记住,所有类在堆上都有它们的可变数据存储结构,但它们很少在相同的内存空间中有它们的常量和代码页。为了节省内存,该类的可执行指令通常只存储一次,而与实例的数量无关。Th
is倾向于暗示每个类也存储一次常量,而与实例无关。最后,它取决于JVM实现。我可以看到一些实现以速度换取空间,有效地保留了所有字符串,我只是不知道有哪一个例子可以做到这一点。您好!我已对我的帖子进行了更改,请查看并取消粘贴。我觉得现在比较孤立了。