并发与并行
JVM
- 并行:多个垃圾回收线程同时进行
- 并发:用户线程和垃圾回收线程同时进行
多线程
- 并行:多核机器,不同核同时进行
- 并发:一定时间段内,分时间片进行
JVM 内存分区
- 本地方法栈(线程私有)
- 本地方法,native方法
- 程序计数器 (线程私有)
- 记录正在执行的指令地址
- 执行本地方法的时候值为undefined
- 线程私有,非共享
- 栈(虚拟机栈)(线程私有)
- 局部变量表,存放基本数据类型,对象的引用,字节码指令地址
- -Xss控制大小
- 栈深不足,StackOverflowError
- 内存不足OutOfMemoryError
- 堆
- 存放对象的实例,数组
- 线程共享,最大,虚拟机启动时创建
- 逻辑上连续,-Xmx -Xms控制堆大小
- OutOfMemoryError
- 方法区—1.7(永久代)—1.8(元空间)
- 存放虚拟机上加载的类信息,常量,静态变量(编译后的代码)
- OutOfMemoryError
- 运行时常量池
*方法区的一部分,存放编译器的字面量,和符号引用
如何定位垃圾
- 引用计数法
- 根可达性分析算法
GC算法
- 复制算法
- 实现简单,效率高,但浪费空间
- 标记清除算法
- 空间碎片
- 标记,清除两个过程效率低
- 标记复制算法
- 浪费空间,连续空间大
- 标记整理算法
- 将存活对象移到一端,其他对象回收
- 分代收集算法
- 将堆分为新生代和老生代
- 新生代每次只有少量对象存活,采用复制算法
- 老年代对象存活率高,采用标记清除算法或者标记整理算法(不需要额外的空间分担)
垃圾收集器
年轻代
- Serial收集器
- 单线程垃圾收集器,进行垃圾回收的时候,其他工作线程停止
- 新生代 复制算法 stop the world
- 老年代 标记清除算法或者标记整理算法 stop the world
- ParNew收集器
- 多条线程,其他同上,减少垃圾回收的停顿时间,停顿时间有较高要求
- 标记-复制算法
- 新生代 复制算法 stop the world
- 老年代 标记清除算法或者标记整理算法 stop the world
- 除了Serial外,只有它可以和CMS配合使用
- Parallel Scavenge收集器
- 标记-复制算法(在新生代)和标记-整理算法(在老年代)
- 类似ParNew收集器。但关注吞吐量,目标是达到一个可控制吞吐量的收集器,最大化CPU的吞吐量
- 停顿时间和吞吐量不可能同时调优
老年代
- SerialOld 标记整理
- 单线程垃圾收集器,进行垃圾回收的时候,其他工作线程停止
- 新生代 复制算法 stop the world
- 老年代 标记清除算法或者标记整理算法 stop the world
- ParallelOld 标记-整理
- 多条线程,其他同上
- 新生代 复制算法 stop the world
- 老年代 标记清除算法或者标记整理算法 stop the world
- cms收集器(Concurrent Mark Sweep) 并发标记清除老年代收集器
- 一种以最短停顿时间为目标的收集器
- 初始标记(stop the world):根可以直接关联的对象
- 并发标记(和用户线程一起):主要标记过程,标记全部对象
- 重新标记(stop the world):由于并发标记时,用户线程也在运行,因此在正式清理前,再做修正标记
- 并发清除(和用户线程一起):基于标记结果,直接清理对象
- 并发收集,低停顿
- G1
- 对垃圾回收设置了优先级,保证了高效性
- 最大的优点是结合了空间整合,不会产生大量碎片,也降低了GC的频率
- 让使用者明确指定停顿时间
1418

被折叠的 条评论
为什么被折叠?



