今日复习:
-
什么是深拷贝,什么是浅拷贝
-
如何处理并发的问题
-
垃圾回收器的基本原理是什么?
-
怎么判断对象是否可以被回收?
-
分代回收中,新生代垃圾回收器有哪些,老年代垃圾回收器有哪些,,详细介绍一下CMS垃圾回收器
-
分代垃圾回收器是如何工作的?
-
内存分配和垃圾回收策略以及Minor GC和Major GC
-
内存泄漏和内存溢出
- 深拷贝指的是增加一个指针并且申请了一块新的内存空间,使增加的指针指向了新的内存空间。浅拷贝指的是增加一个指针指向原来的内存地址。
- 当jvm在创建对象分配内存空间的时候需要考虑并发的问题。一般有两种解决方式,CAS同步解决和TLAB本地线程分配缓冲。TLAB指的是把内存分配的动作按照线程划分在不同的空间之中进行。即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲。哪个线程要分配内存,就在哪个线程的TLAB上进行分配。只有当TLAB用完并分配新的TLAB的时候,才需要同步锁。
- GC通过有向图的形式来记录和管理堆中的所有对象。通过这种方式确定哪些对象是可达的,哪些对象是不可达的。当GC确定一些对象为不可达时,GC有责任回收这些对象的空间。
- 一个是引用计数器法,为每一个对象分配一个计数器,当有对象引用的时候就加一,引用被释放的时候就减一。当计数器的值为0时说明没有任何引用指向这个对象,这个对象就是可以被回收。另一个是可达性分析算法:从GC ROOTS开始向下搜索,搜索过的路径被称为引用链,当一个对象到GC ROOTS没有任何引用链相连的时候,则证明此对象是可以被回收的。
- 新生代垃圾回收器Serial ,PraNew, Parallel Scavenge,老年代的垃圾回收器Serial Old,Parallel Old,CMS,还有用于回收整个堆的G1收集器。CMS垃圾回收器使用的是标记清除算法来实现的,所以在gc的时候会产生大量的内存碎片,当剩余内存不能满足程序运行要求的时候,系统将会出现Concurrent Mode Failure,临时CMS会采用Serial Old回收器进行垃圾清除,此时性能将会被降低。
- 分代回收器有两个分区,年轻代和老年代,老年代与新生代的大小比例为3:1。新生代使用的是复制算法,有三个区Eden,To Survivor,From Survivor 三个区的大小比例为8:1:1。它的执行流程是把Eden和From Survivor的存活的对象放入To Survivor,清空Eden和From Survivor,然后将To Survivor变为From Survivor,From Survivor变为To Survivor。每次存活对象移动后年龄加一,当年龄达到15时,升级为老年代,大对象也会直接进入老年代。
- 对象优先在年轻代中分配,当年轻代中的内存不够的时候会触发一次Minor GC,当此次GC之后内存还是不够,将会触发内存分配担保机制,在老年代分配内存。Major GC和FullGC 主要发生在老年代,出现Major GC时至少会触发一次Minor GC。大对象和长期存活的对象将会在老年代中分配。
- 内存溢出是指堆内存不足以分配,内存泄漏是内存溢出的一种,是指程序在运行过程中无法释放不再使用的内存,导致内存的占用不断增高,最终导致内存被耗尽。