不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨— blog.csdn.net/cjm24848365…
关于回收机制我曾经写过一篇很详细的文章,感兴趣的可以去看一下https://blog.csdn.net/cjm2484836553/article/details/103842357。
但是!由于我是那种 "一看就会 ,一说就废" 型的面试者,所以面试之前 我就希望 可以整理的 尽可能浓缩浓缩再浓缩,否则道理我都懂,就是记不住呀!
来吧,直奔主题!

java回收机制 主要是通过判断 我们对象的存活情况来进行的。
我们采用的主要是 可达性分析 算法。
可达性分析 就是依据 我们的对象能不能到达GCRoots 作为标准的。
在Java中 可作为GC Roots的对象包括:
-
1.方法区: 类静态属性的对象;
-
2.方法区: 常量的对象;
-
3.虚拟机栈(本地变量表)中的对象.
-
4.本地方法栈JNI(Native方法)中的对象。
下面我们再通过代码,来理解一下可达性分析是如何计算的:
/** * 可达性分析算法 */ Object o =new Object(); static Object GCRoot1 =new Object(); //GC Roots final static Object GCRoot2 =new Object();//GC Roots public void method1() { //可达 Object object1 = GCRoot1; //=不是赋值,在对象中是引用,传递的是右边对象的地址 Object object2 = object1; Object object3 = object1; Object object4 = object3; } public void method2(){ //不可达(方法运行完后可回收) Object object5 = o;//o不是GCRoots Object object6 = object5; Object object7 = object5; } //本地变量表中引用的对象 public void stack(){ Object ostack =new Object(); //本地变量表的对象 Object object9 = ostack; //以上object9 在方法没有(运行完)出栈前都是可达的 } 复制代码
我画个图来分析吧:

这下你该明白java的回收机制了吧,哈哈哈哈哈~
最后我们再来说一下 如何减少OOM的概率 :
-
1.尽可能少的发生内存泄漏
因为因为一旦内存泄漏多,就会有许多不需要的内存遗留在外面,就容易造成OOM。
-
2.尽可能不要在 循环 申请内存
因为可达性分析的存在(虚拟机栈(本地变量表)中的对象可作为GC Roots),当方法执行过程中,对象会在GC Roots中,而不能及时被GC回收掉,从而造成内存溢出。
-
3.尽可能不在调用次数多的函数中申请内存
(比如说一些回调函数)
积累点滴,做好自己~
原文
https://juejin.im/post/5e7f6ef251882573cd41974e
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Android面试专题(九):java回收机制 及 减少OOM的方法