目录
JVM简介
JVM : 为了实现Java的跨平台性质
垃圾回收简介
垃圾收集主要是对内存的释放。创建对象的时候申请一个空间。
- 不在使用的内存空间应该回收
- Java中消除了回收无用内存空间的职责;提供一种系统级线程跟踪存储空间的分配情况。在JVM的空闲时,检查并释放可释放的存储空间;相比C++开发人员负责要自己收回无用内存
- 垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预
- GC自动回收,提高了内存空间的利用雄安率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏
高级的面试题 :
- 垃圾收集器有几种
- 垃圾收集器底层原理剖析
- 垃圾收集器底层算法、优化
小扩展 :
Java : 业务方面
Golang : 专门的中间件或者运维开发
掌握这两门语言,对成为架构师非常给力
Garbage colletors
在三种垃圾回收算法的基础之上,构建了十种垃圾回收器 :
目前生产环境 jdk1.8 , 常用的是
Parallel Scavenge (PS)
Parallel Old (PO)
1.9使用 G1
Root Searching
该方法垃圾回收主要算法之一,简称(根可达性分析)
JVM定义一个名为 GC Roots 的对象作为起始点, 这个 GC Roots可用有多个,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相链的时候,则证明此对象不可用,即可用进行垃圾回收
GC Roots对象一般包括 :
- 虚拟机栈(栈帧中本地变量表)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象
常见的垃圾回收算法
Mark-Sweep 标记清除
将可回收的垃圾,标记出来并且清理
但是会使得空间碎片化
Copying 拷贝
每次只允许你用一半的内存,我们有用的内存丢到另一半去。
虽然效率很高,但是造成了空间浪费
Mark-Compact 标记压缩
我们找到可回收的内存区块,将其清除,然后将所有有用的对象挪到前面
GC演化过程
- 随着内存大小的不断增大而演进
- 几兆-几十兆
S e r i a l Serial Serial单线程 S T W STW STW垃圾回收 - 几十兆- 上百兆
p a r a l l e l parallel parallel并行多线程 - 几十G
C o u n c u r r e n t G C Councurrent\ GC Councurrent GC
目前 1.8 1.8 1.8采用分代管理方法
无论有多大的内存,我们将其 ( 1 : 2 ) (1:2) (1:2)的分为两块,比例为 1 1 1的叫做新生代另一个叫老年代
当一个对象诞生的时候,我们优先将其放在新生代,当其回收了好多次15/6还没有回收掉,我们将其放进老年代
堆逻辑分析
逻辑上来讲,首次分配在
e
d
e
n
eden
eden区,对于一次
Y
G
C
YGC
YGC过程,我们将
e
d
e
n
eden
eden区所有活的对象复制到
s
u
r
v
i
v
o
r
survivor
survivor里面