1 为什么说堆栈分离使垃圾分类成为可能
可以作为GC roots 中的对象有虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中native 引用的对象都是作为GC roots的,因为系统中除了栈以外,以栈或对象中的引用找到对象,又以这些对象找到其他对象,形成一个对象树,对象的引用以null 或者是基本类型结束,如果栈中有多个引用,就有多个对象树,这些树上的对象都是都是系统当前运行的对象,不能被垃圾回收,而其他剩余对象,则可以视为 无法引用到的对象,可以被当做垃圾回收
2
如何解决同时存在的对象创建和对象回收问题(别人的结论)
垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式 中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解 决二者矛盾的方式。
但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求 很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。 为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象 的同时又要回收对象