JVM的GC收集器概念是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
java在运行时,生成的对象都在堆里存放着,有些对象的生命周期很短,只几行代码运行完就没用了.没用了之后不能放任他在堆里, 要进行回收,把空间空出来,给后面的对象.
我们常用收拾屋子来比喻jvm清理堆.这里, 我们不仅仅有个房子, 我们还可以想得再大胆一些,天降一女侠当老婆,是家里的一把手,掌管整个家. 不久,又天降一大胖小子, 小子性格独立,也有自己的一块小空间.然后小刀就要开始打扫卫生,收拾房子了!
于生活中, 就是我要开始打扫卫生了, 大家先别动,让我看看哪些东西是现在女侠和小子没有在用的,又散落在外面占用空间, 当然我也不敢让她们停太长时间, 所以趁他们停下来的时候,赶紧扫一眼,先把他们手上没有用到的东西记下来, 然后赶紧让她们继续玩乐.
于JVM中,就是应用先停下来,然后GC工作线程,赶紧扫描一遍,看看哪些对象是还有用,哪些是没用的
这里其实是两个概念, 一个是安全点, 一个是安全区域. 都是描述STW发生的时机, 要让STW发生的时候,系统的对象引用关系不会改变.
在我要喊停女侠和小子的时候, 如果我一喊相当于按了定时器,把她们都定住了,然后我发现女侠还在倒水, 不太好, 只先解锁女侠的锁定, 让她倒完水再停. 这是抢先式中断现在生活中, 很少有这样的.
更多的场景是, 她们的耳朵一直听着我有没有说话(轮询状态), 我一喊停. 然后她们赶紧把手里面的活停下来,或者去沙发坐着,或者去床上躺着等自己最近的安全点上主动停下.
安全区域: 如果我喊停的时候, 小子刚好在睡觉(线程在休眠,或者阻塞). 虽然没有听到我喊的停,但也是安全的.
有句话说是, 擒贼先擒王,要抓住事物的主要矛盾! 当家里的东西很乱的时候, 要问问女侠和小子是怎么回事, 过去一看, 好家伙, 原来女侠在教小子识物学字. 学一个字,找一个对应的物品. 这时候, 本扫地的只要拿着那个小本子看一看, 就能顺着找到哪些是要用的 ,哪些是已经没用的了.
在JVM中, 有一个根对象的概念, 就是堆里面的东西和他们有关系的就是要用的, 没有关系的,就是可以回收的了.我们来这样分类记忆
先是和类相关的:
类静类属性引用的对象
然后是和实例相关的:
虚拟栈中使用到的参数,局部变量,临时变量
JNI中引用的对象
然后是JVM层面的:
常量引用的对象,如字符串常量池里的引用
所有被synchronized 持有的对象
虚拟机内部的引用,如Class对象, 常驻内存的异常对象,系统类加载器等等
纵观现在对大数据量的处理,大都是分而治之, 划区而治. 那区与区之间不可能为了查A区的某条信息,把整个B区都查一遍.
如小刀我现在在上海工作, 女侠在成都.那么在上海就会有个记忆集,里面存着, 有成都某某区某某街(精确度有不同的实现)到小刀的一条引用关系.
那哪一天上海要统计人员的时候, 来找到小刀了, 我说我在成都哪里哪里还有人, 那统计人员就到那个区域查一查, 看我有没有说慌. 如确实有引用关系, 好,那小刀还有人关心着, 让他继续工作吧. 要是一查,发现没有这个引用关系, 得了, 没人要的小刀, 可以关进小黑屋喽~!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。