我知道有很多关于垃圾收集的问题,我已经仔细研究过了,但是我仍然有一些疑问。
System.gc()
的需要是什么?在哪种情况下有用?mycar
对象,所以什么时候mycar
对象将在永久生成中移动?System.gc()
确实会降低应用程序的性能并降低应用程序的速度吗?或者,无论何时由JVM完成垃圾收集,都会降低应用程序的性能,并使我们的应用程序工作缓慢?发布于 2016-08-26 06:44:24
1) System.gc()
的工作频率更高。人们说不能强制垃圾收集的意思是JVM比您更了解内存的状态,如果JVM知道这不是一个好时机,就不能强制垃圾收集。
2)我不相信用户生成的类会变成perm gen (尽管我可能错了),它的存在是为了存储JVM始终需要的元信息,如类和内部字符串(pre 7)等。
3)静态变量是在class
上声明的引用。类存储在永久的代中,因此根据它们本身的性质,静态变量将始终被引用,因此在perm gen中也使用它们也是有意义的。
4)是。
从注释中编辑:垃圾收集永远不会在永久生成中完成。我说的对吗?
不完全是。垃圾收集很复杂!与堆的其他部分相比,perm代的易失性要小得多,而且那里的对象很可能会引用较低空间中的其他对象。我认为垃圾收集和perm gen的行为取决于您正在使用的Java版本,我相信较新的版本也会垃圾收集perm gen,这是有意义的,因为Java大量使用代理对象。
发布于 2016-08-26 08:19:12
( 1)经常重复的说法是正确的,但却具有误导性。方法的规范(即javadocs)的措辞使noop实现有效。换句话说,没有规范--保证它做任何事情,或者只异步地做一些事情,或者什么的。
但是实现可以提供更强大的行为。换句话说,人们应该说的是,System.gc
是依赖于实现和配置的,在某些情况下,在每个调用中都会始终触发GC。
2) Perm是java 8之前hotspot JVM的一个实现细节。
3)他们不是
4)“应用程序”太模糊,可以在共享JVM上运行多个应用程序。每个JVM有一个托管堆。
5)这是两个不同的问题。
6)取决于JVM的实现和所选择的GC算法。我建议你看一下文件。
https://stackoverflow.com/questions/39159764
复制相似问题