首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对java垃圾收集的质疑

对java垃圾收集的质疑
EN

Stack Overflow用户
提问于 2016-08-26 06:35:36
回答 2查看 232关注 0票数 5

我知道有很多关于垃圾收集的问题,我已经仔细研究过了,但是我仍然有一些疑问。

  1. 如果我们不能强制JVM进行垃圾收集,那么System.gc()的需要是什么?在哪种情况下有用?
  2. 我了解年轻一代伊甸园,所以,S1和老一代,以及物体是如何从年轻一代移到老一代的。什么时候一个物体会被移动到永久的世代?例如,我有一个具有引用且不符合垃圾收集条件的mycar对象,所以什么时候mycar对象将在永久生成中移动?
  3. 我读过静态变量存储在永久世代中。什么时候会被垃圾收集,其他什么类型的对象被存储在永久代中?为什么静态变量存储在永久代中,永久代的用途是什么?
  4. 我知道对象存储在堆内存中。每个应用程序都有自己的堆内存,这是真的吗?
  5. 调用System.gc()确实会降低应用程序的性能并降低应用程序的速度吗?或者,无论何时由JVM完成垃圾收集,都会降低应用程序的性能,并使我们的应用程序工作缓慢?
  6. 在哪些情况下完成了部分垃圾收集,何时执行主要垃圾收集?
EN

回答 2

Stack Overflow用户

发布于 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大量使用代理对象。

票数 3
EN

Stack Overflow用户

发布于 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算法。我建议你看一下文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39159764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档