“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战”
引言
前面讲了jVM有哪些内存区域怎么划分的,什么时候会出现内存溢出的异常,学完了草原上的基本环境,我们进入狼的篇章,等待你是不是跑题了,这跟狼有啥关系,因为如果把对象比喻成羊,那垃圾回收就是群狼,狼来限制羊的数量,保证自然正常运转,在蒙古,狼是神灵,每当有人去世,都会把尸体喂狼,狼在他们眼中就是神秘的存在,同样,我们的垃圾回收也有很多奥秘等着我们揭开,那就和我一起来看看吧。
概述
其实,最早垃圾回收不是诞生于java语言的,最早是麻省的lisp(呀呀呀,怎么又是美国的),哎没错,承认吧,这货1960年就使用内存动态分配和垃圾收集技术的语言了,其实归根结底垃圾回收主要解决三个问题:什么时候回收?回收哪块啊?怎么回收啊?
为什么学(why)?
因为平常要排查各种内存溢出和泄漏的问题,还有就是高并发场景下需要对垃圾回收进行必要的监控和调节。
回收哪块
前面提到了一些基础,所以假设大家都不是小白了,我们知道Java中有三块内存是和线程的生命周期是相同的,分别是:程序计数器、本地方法栈和虚拟机栈,我们知道每个方法的执行都会在栈中由线程创建一个栈帧,伴随着方法的调用和结束进行着入栈和出栈的操作,每个栈帧的大小都是可以确定下来的,说白了,这几块区域自己都心里有数,所以不是我们考虑垃圾回收的对象。
那就剩堆和方法区了,就这俩块区域自己心里没数,你就有疑问了这两块哪里没数了啊,那我问你哦(一本正经),方法区是干嘛的?那还用说,存放类的信息和方法信息的啊,那好,那你知道一个接口有多少个实现类嘛?每个类的内存是多少呢?方法里会用到多少参数?占多少内存,创建多少对象?支支吾吾不出来吧,所以啊,这两快区域有很显著的不确定性,需要动态分配内存。
题外话
全力以赴才是对自己真实世界的不辜负,做任何事都要全力以赴,什么叫全力以赴啊?
《狼图腾》中有这样一段描述:你要是想在草原生活下去,就必须要比狼聪明,比狼强大。
谁敢和狼斗啊,我敢保证遇见了绝对会发抖,就那犀利的眼神都能让你的灵魂抖上一抖,但是你能稳定自己焦躁的心,你不怕,你不光不怕,还能和它对视,了解之后,还能用所学和它战斗,如果遭遇失败,还能总结经验再战,直到战胜它,这就叫全力以赴。
实际上,我们每个人的心理都住着一匹狼,慢慢地了解它,接近它,靠近它,最终驯服它(怎么有种体内封印了一条九尾的感觉),没错它就会变成你的力量,随你征战沙场。