前言
众所周知,java语言跟c语言最大的一个差别就是内存回收。java语言无需开发者亲自管理内存的分配和回收,而由jvm虚拟机进行内存统一管理。而c语言则需要自行申请内存和归还内存。用一个形象的比喻说明就是,c语言的内存管理像是学校的饭堂,学生就餐完毕需要自己清理桌面和归还餐具,这样的好处就是内存使用完毕后可以及时归还,垃圾内存少,而缺点就是不能保证每一个学生的素质,一旦内存释放不恰当,可能会造成严重后果。java语言的内存管理则像是外面的餐馆,客人就餐完毕离开即可,无需整理餐具,交由清洁工清理,但不好之处在于如果内存清理不及时,会造成后面的客人无法就餐。
java的内存模型图如下(我自己画的,如有不对,帮忙指出):
JMM (1).png
使用jdk自带工具查看gc过程
工具路径:C:\Program Files\Java\jdk1.8.0_161\bin\jvisualvm
双击打开,界面如下
2020-03-02 144522.png
选择java程序
2020-03-02 14452333.png
gc过程(需要安装插件)
2020-03-02 1445233.png
2020-03-02 14452333.png
用此工具看到的gc过程是一个动态的过程,对象从Eden区产生,Eden区满了后进行一次minor gc,回收Eden区和S1(或者S2)区的垃圾对象,将剩余的对象复制到S2(或者S1)区。