1.什么是GC?
Java中对象内存是自动分配的,机器/JVM内存是有限的,同时程序又在不停创建对象,为了保证程序运转,需要将无用的对象清理掉,释放内存,供新创建的对象使用,GC就是用来清理无用对象用的
2.什么是无用对象?
没有被程序引用的对象是无用对象
3.怎么判断XX对象没有被引用?
引用计数--死循环
GC Roots遍历
4.创建的对象的生命周期?
在哪出生-----Eden
长大过程中会去哪---大部分都是朝生夕死,顽强的对象会经历 Eden->S0->S1->S0->S1->...>Olden
如何判断对象长大了----每次GC之后,能幸存就年龄+1,如果年龄足够大,就可以去Olden区了
5.GC怎么清理无用对象?
笨办法:扫描整个JVM堆,标记出无用对象,然后remove
笨办法存在的问题:JVM堆空间太大,打扫完天都黑了,都干不了活了;还有一个问题是remove完,空间里面七零八落的,都是碎片
如何防止碎片化:打扫完之后,整理一下,存活的对象放在一起,剩余的空间都可以随便用
如何解决打扫慢的问题:1>再找个人/Thread帮忙一起打扫;2>先打扫局部空间,别那么累(对JVM堆进行分块分区)
6.JVM为什么要分这么几个代(年轻代、年老代、永久代)?
一句话:为了高效地完成必须的清理工作
研究表明:90%对象朝生夕死,那针对这部分对象可以单独放一个房间,打扫频率调高一些
Eden->S0->S1->Olden
Minor Gc->Minor Gc->Minor-Gc->Marjor Gc
7.GC的时候会发生什么?
STW=stop the world event
minor gc/major gc都会STW
STW发生的时候,应用程序会怎样:所有用户线程都被挂起->运转中的Thread Count降为0->Client Request无响应 HTTP 502?
STW之后呢:内存被释放
8.GC的运转过程是怎样的?
9.Minor GC和Major GC的区别是啥?
打扫的区域:
打扫的速度:
10.该选择什么样的GC?
看你的需求是什么:响应时间 VS 吞吐量
响应时间:focus on responding in short periods of time.
吞吐量:单元时间内处理事务/数据库查询数量,批处理操作虽然耗时较长,但平均算下来单位时间内处理任务数量多
如果要求响应时间,那就找多个Thread,分区进行打扫