1.System.gc()**
system.gc()或Runtime.getRunTime().gc()会调用Full gc对堆中空间进行回收. 但是不一定调用成功.一些特殊情况下,比如编写性能基准,我们可以在运行之间调用System.gc
2.内存溢出和内存泄露
内存溢出:发生了OOM,即堆内存不够.存在大量大对象.并且无法被回收.
内存泄露:存在大量没有被程序应用,但是无法被GC回收,最后导致OOM.举例:单例对象的生命周期和程序一样长,如果存在外部对象引用的话,这个外部对象无法被回收. 还有一种资源没有关闭引起的内存泄露.如网络连接, NIO,数据库连接池等.
3.垃圾回收的并行和并发
并行:多个进程同时在多个CPU上进行,没有抢占资源.并行和串行的时候用户线程处于等待状态
并发:单个cpu上存在多个线程,需要抢占资源.可以和用户线程抢占资源同时进行.
4.安全点和安全区域:
安全点:程序执行并非在所有地方都能停顿下来开始GC,只有特定的位置才能停顿下来开始GC,这些位置称为安全点.
如果太少,导致GC等待时间长,如果太多导致运行时性能问题,,大部分指令执行都比较短,通常会根据是否具有让程序长时间执行的特征为标准选择一些执行时间较长的指令作为安全点,比如方法调用,循环跳转和异常跳转等.
设置一个中断标志,各个线程运行到安全点的时候,主动轮询这个标志,如果标志为真,则将自己进行中断挂起.
安全标志:如果线程处于sleep或者blocked状态,这时候线程无法响应jvm中断请求,走到安全点去中断挂起。对于这种情况,就需要安全区域来解决, 安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中任何位置开始GC都是安全的。
当线程运行到安全区域代码时,首先标志已经进入了安全区域,如果GC,JVM会忽略标识为安全区域状态的线程.
当线程即将离开安全区域时,会检查JVM是否已经完成GC,如果完成了,则继续运行。否则线程必须等待直到收到可以安全离开安全区域的信号为止
5.强软弱虚引用
强应用:最传统的引用定义,类似于Object object = new Object();这类的引用.对象存在强引用,就不会被GC回收.
软应用:在即将发成内存溢出时,jvm会进行一次对软应用的内存清理,如果内存还不够才会报内存溢出.通常用来做敏感缓存,高速缓存就用到了软应用.
弱引用:每次垃圾回收都会将弱应用关联的对象回收,不管有没有内存溢出.
虚应用:一个对象是否由虚应用,对其生存时间完全不造成影响,唯一目的时对象被GC回收的时候,通知.
终结器引用:略