我知道很多关于垃圾收集的问题,我已经完成了它们,但我仍然有一些疑问。
如果我们不能强制JVM进行垃圾收集那么System.gc()
需要什么?在哪种情况下它很有用?
我知道年轻一代[eden,SO,S1]和老一代以及物体如何从年轻一代转移到老一代。什么时候将对象移动到永久世代?例如,我有mycar
对象有引用,不符合垃圾回收的条件,所以什么时候mycar
对象会在永久生成中移动?
我已经读过静态变量存储在永久代中。什么时候它们会被垃圾收集以及永久生成哪种类型的其他物品?为什么静态变量存储在永久生成中以及永久生成的用途是什么?
我知道对象存储在堆内存中。这是真的,每个应用程序都有自己的堆内存吗?
调用System.gc()
是否会降低应用程序性能并降低我们的应用程序速度?或者,当JVM完成垃圾收集时,它会降低应用程序性能并使我们的应用程序工作缓慢?
在哪些情况下,部分垃圾收集已完成,何时进行主要垃圾收集?
答案 0 :(得分:3)
1)System.gc()
经常工作。当人们说你不能强制进行垃圾收集时,人们的意思是JVM比你更了解内存状态,如果JVM知道这不是一个好时机,你就不能强制进行垃圾收集。
2)我不相信用户生成的类会使它成为perm gen(虽然我可能是错的),它存在于存储元信息,如类和实习字符串(Java 7之前)等,它们始终是必需的JVM。
3)静态变量是它们被声明的class
的引用。类存储在永久生成中,因此它们的本质静态变量将始终被引用,因此将它们置于perm gen中也是有意义的。
4)是的。
从评论中编辑: 永久生成永远不会进行垃圾收集。我是对的吗?
不完全。垃圾收集很复杂! perm gen的可能性远远低于堆的其余部分,并且很可能那里的对象将引用较低空间中的其他对象。我认为垃圾收集和perm gen的行为取决于你正在使用的Java版本,我相信新版本也会垃圾收集perm gen,这是有道理的,因为Java大量使用代理对象。
答案 1 :(得分:1)
1)经常重复的陈述是真实的,但却具有误导性。该方法的规范(即javadocs)以使noop实现有效的方式表达。换句话说,没有规范保证它做任何事情或只做异步或其他事情。
但是实现可以提供更强大的行为。换句话说,人们应该说的是System.gc
是依赖于实现和配置的,并且在某些情况下 会在每次调用时始终触发GC。
2)Perm gen是java 8之前的热点JVM的实现细节。
3)他们不是
4)"应用"太模糊了,你可以在共享的JVM上运行多个应用程序。每个JVM都有一个托管堆。
5)这是两个不同的问题。
6)取决于JVM实现和所选的GC算法。我建议你阅读文档。