native 溢出 也就是 direct memory 内存溢出 直接内存,不是虚拟机内存。是系统内存。
发现内存控件不足了就通知收集器进行垃圾回收,他只能等待 老年代 满了后 Full GC,然后 “顺带着”帮他清理掉内存的废气对象。否则他只能一直等到抛出内存异常时,先 catch 掉,在catch块中 “大喊”一声 System.gc()。要是虚拟机还是不听(System.gc设置关闭,调用不起作用 参数 -XX:+DiskableExplicitGC开关)。那就只能眼睁睁的看着堆中还有很多空闲内存。自己却不得不抛出内存溢出异常了。
垃圾收集器
新生代收集器 采用 复制算法。
serial 连续的, jdk 1.3.1之前是新生代手机的唯一选择。单线程收集器。收集时,会暂停其他所有工作线程,直到他结束。Stop The World。
(单个Cpu的环境来说)效率高,由于暂停了其他线程,没有线程交互的开销,只有他一个专心做垃圾收集获得最高的单线程收集效率。
(多个的话)他暂停了 其他cpu的工作。就低了。
ParNew 收集器其实就是 Serial收集器 的多线程版本。其他跟serial收集器完全一下。新生代收集器。只有他能与CMS(concurrent mark sweep)收集器配合工作。
CPU较少情况下,不一定不 serial收集器高效。 他对于GC是系统资源的有效利用还是有好处的。
并发与并行收集器 概念(指多线程下)
并行(Parallel):指多天垃圾收集线程并行工作,但此时用户线程仍处于等待状态。
并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续执行,而垃圾收集程序运行于另一个CPU上。
Parallel Scavenge 收集器 目标是达到一个可用控制的吞吐量。可以自适应调节。
老年代 收集器
Serial Old 收集器 单线程收集器,使用 “标记-整理” 算法
Parallel old 收集器 老年代收集器,使用多线程和“标记-整理”算法。在 jdk1.6才开始提供。
CMS(Concurrent Mark Sweep)收集器 是一种以获取最短回收停顿时间为目标的收集器。使用“标记-清除” 算法。
运作过程复杂,分4个步骤:
1、初始标记
2、并发标记
3、重新标记
4、并发清除
初始标记、重新标记 会stop the world。 但很快。另外2个比这个耗时,但可以与用户线程一起工作。
缺点: 看书
详情请看 深入理解java虚拟机一书。
G1 收集器
看书了解
|
|