对象的内存分配 - 垃圾回收过程
1 对象分配到新生代区域中
所有new出来的对象都会最先分配到新生代区域中,两个survivor区域初始化是为空的。
2 触发 Minor GC
当eden区域满了之后,就引发一次 minor garbage collection(Minor GC)。
3 移动到 S0 Survivor Space
当在进行minor garbage collection(Minor GC)后,存活下来的对象就会被移动到S0 survivor space。
4 再次触发 Minor GC
当eden区域又填满的时候,又会发生下一次的Minor GC,存活的对象会被移动到survivor区域,而未存活对象会被直接删除。
但是,不同的是,在这次的垃圾回收中,存活对象和之前的survivor中的对象都会被移动到S1 survivor space中。
一旦所有对象都被移动到s1中,那么s0和Eden中的对象就会被清除。
仔细观察图中的对象,数字表示经历的垃圾收集的次数。目前我们已经有不同的年龄对象了。
5 循环触发 Minor GC
当eden区域又填满的时候,就会再次触发 Minor GC,从而重复步骤4中的操作,以清除需要回收的对象,并且又切换一次survivor区域,所有存活的对象都被移动至S0。Eden和S1区域中的对象被清除。
6 移动到老年代
重复以上步骤,并一直记录对象的年龄。
当有对象的年龄到达一定的阈值的时候,就将新生代中的对象移动到老年代中。在本例中,这个阈值为8。
7 重复以上
接下来垃圾收集器就会不断重复以上步骤,不断的进行对象的清除和年代的移动。
我们观察上述过程可以发现,大部分的垃圾收集过程都是在新生代进行的,直到老年代中的内存不够用了才会发起一次 major GC,会进行标记和整理压缩。
Reference
- 《深入理解Java虚拟机》
- 深入解析Java垃圾回收机制 - https://www.jianshu.com/p/ee3e9dff5700
FEATURED TAGS
algorithm
algorithmproblem
architecturalpattern
architecture
aws
c#
cachesystem
codis
compile
concurrentcontrol
database
dataformat
datastructure
debug
design
designpattern
distributedsystem
django
docker
domain
engineering
freebsd
git
golang
grafana
hackintosh
hadoop
hardware
hexo
http
hugo
ios
iot
java
javaee
javascript
kafka
kubernetes
linux
linuxcommand
linuxio
lock
macos
markdown
microservices
mysql
nas
network
networkprogramming
nginx
node.js
npm
oop
openwrt
operatingsystem
padavan
performance
programming
prometheus
protobuf
python
redis
router
security
shell
software testing
spring
sql
systemdesign
truenas
ubuntu
vmware
vpn
windows
wmware
wordpress
xml
zookeeper