1.1 java之入门(垃圾回收机制)

1.什么是垃圾
内存就像一个房间,写程序的时候不断的往这个房间放数据,不用了这个垃圾得自己回收,不管什么语言都会有垃圾,
2.垃圾怎么找?(怎么定位,有多少个对象指向我)
引用计数,有3个引用,我这个对象就是3,去掉一个引用我这个对象减一个,什么时候变为0了这个对象·就是一个垃圾,但是不能解决环形垃圾,一坨垃圾,单个说又不是垃圾,jvm里面用根可达算法,就是从线程栈变量,静态变量,常量池从根开始找找不到你的就是垃圾。
3.怎么清除
在这里插入图片描述

(1)标记清除:找到的垃圾,直接改成可用,最后内存会碎片化,速度比较快
(2) 复制算法:
在这里插入图片描述
算法过程:

新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象复制到B块。
清理A块所有对象。
新生对象被分配到B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象复制到A块。
清理B块所有对象。
就不停做循环动作。
拷贝:不管你又多少内存直接砍成两半,把有用的copy速度非常快但是浪费内存

(3)标记压缩:既不浪费内存,又不产生碎片,首先标记垃圾出来,把内存做一个压缩,把有用的顶上去,效率比较低
4.垃圾回收器
分为:不分带模型,分带模型
1.8以后推荐不分带
分带模型了就分为新生代,老年代:几次回收不了的就是老年代,为什么要划分新生代和老年代是为了提高效率,他们采用不同的垃圾回收的方式不一样,新生代的放的就是刚刚new出来的对象。为什么要这么做呢?因为刚刚new出来的对象很容易回收很快就没用了,把有用的拿出来就可以了,采用拷贝算法,在新生代分为3个区域,Eden万一有10个对象,只有一个是垃圾其他不是垃圾,我就不再Eden找来找去,我就直接把有用的放到surivor把剩下的全部扔掉。死活都回收不了的放到老年代
在这里插入图片描述
整个过程:
new出来的对象尝试往栈中放,分到栈,如果分不到看他栈够不够大,如果够大直接放到老年代,如果不够大尝试线程本地,线程本地分满了尝试Eden区,放到Eden区后直接回收,回收不完放到s1,s1在回收,年龄够了直接到老年代,年龄不够放到s2两个来回替换。
放到栈中的好处是当一个方法结束栈针会自动弹出就消失了,不用gc垃圾回收。但是栈的空间非常小
在这里插入图片描述
在这里插入图片描述

jps :查看当前程序的进程
jstat :查看gc某个进程的使用情况
堆空间就是新生代老年代,老年代就是oc、ou ;oc总量 ou使用了多少
在这里插入图片描述
如果是为了提高响应时间,提高吞吐量:可以使用不同的收集器(cms,g1)增大线程数量
https://blog.csdn.net/Winner941112/article/details/102679614

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值