疯狂java学习笔记(四)

疯狂java学习笔记(四)

本系列是基础知识巩固,主要参考李刚老师的疯狂java 突破程序员基本功的16课这本书籍的学习笔记总结。

一、内存管理

1.java对象在内存中的状态:
可达状态:当一个对象被创建之后有一个以上的引用变量引用它。
可恢复状态:当某个对象不再有引用变量引用,将先进入可恢复状态,在这个状态下系统垃圾回收机制准备回收对象,在回收对象前调用可恢复对象的finalize方法进行资源清理,若此方法中重新让一个以上的变量引用该对象则其重新变为可达,否则进入不可达状态。
不可达状态:所有对象关联被切断且finalize方法也没有使其变为可达,那这个对象将永久性的失去引用,变为不可达,只有变为不可达状态系统才会回收其资源。
2.强引用:创建一个对象赋值给一个变量,这个引用就是强引用;
3.软引用:软引用需要使用SoftReference来实现,特征是当系统有足够资源时不回收软引用,当系统资源紧张时回收。
4.弱引用:需要通过WeakReference来实现,弱引用的对象会在垃圾回收时被回收(在回收前还是能调用打印出来);
5.虚引用:单独使用没有意义,因为单独的虚引用和不引用没有区别,只有在与ReferenceQueue配合使用时才有价值,用于跟踪垃圾回收状态。ReferenceQueue中保存着虚引用这个引用而不保存实际对象。

二、内存回收方式

6.串行回收与并行回收:不管有多少个U只有一个在回收则为串行,并行效率高但需要更好的算法也会生成更多的内存碎片;
7.并发执行和应用停止:指的时回收方式,程序运行中调用回收方法导致应用停止必须等待回收完成后才能继续运行还是边回收边运行;
8.压缩与不压缩与复制:是否将对象搬运到一起回收,不压缩会产生更多的内存碎片但是效率高,压缩可以将对象搬运至一起回收,不压缩回收速度快再分配慢,压缩回收慢再分配快。复制回收则是将所有可达对象复制到另一块内存中然后对整块内存进行回收。
9.分代回收:现行的垃圾回收方式,根据对象生存时间的长短将其分为young代old代和permanent代执行不同的回收算法回收。
10.young代:由一个enden区与两个survivor区组成,绝大多数对象直接被分配到enden区,survivor区两块只有一块在运行,另一块用于复制回收。进入survivor区的对象至少在young代进行过一次回收。当young代内存快用完时由于回收开销较小且回收频繁,我们称之为次要回收。
11.old代:young代的对象在经历数次回收依然存活的对象我们认为其不会很容易死去,将其转移代Old区,且Old区会不断增大则需要更多的内存,Old区回收频率不会很频繁因为对象很难死去,由于Old区会越来越大所以每次回收需要更长的时间。当old代内存快用完时,垃圾回收机制将会进行全回收,对old与young代一起回收,此时成本就很高,也称为主回收;
12.permanent代:装载class方法等信息无需回收。

三、垃圾回收器

13.串行回收其:运行时使用-XX:+UseSerialGC来使用,特点时串行回收(只使用一个u)且回收时会使得生产暂停。
14.并行回收器:运行时使用-XX:+UseParallelGC来使用,能用-XX:GCParallelGCThreads=size来设置线程数,特点是能运用多cpu的计算能力来提高垃圾回收吞吐量,其他和串行一致。
15.并行压缩回收器:运行时使用-XX:+UseParallelOld来使用且也能用-XX:GCParallelGCThreads=size来设置线程数,特点是将old代分为几个固定的区域,先进性mark阶段,垃圾回收线程将会标记old代中可达对象的信息。当某个对象被标记为可达时还会更新对象所在区域的大小和位置,然后进入summary阶段,直接操作old代的区域扫描每个区域的密集度,从左边开始当扫描到一个区域能回收的空间到某一数值时将会对该区域以及该区域右边的区域全部进行压缩垃圾回收。
16.并发标识-清理回收器(CMS):运行时使用-XX:+UseConcMarkSweepGC来使用,CMS对Old代回收时并发操作而不是并行,回收时会短暂的暂停称之为初始标识,这个阶段仅标记所有直接引用的可达对象。然后进入并发标识阶段,通过直接可达对象寻找其他可达对象,由于是与程序并发运行所以无法保证所有的可达对象全都被标记出来,所以此时会再次短暂的暂停一下重新标记之前可能漏掉的对象。这个阶段称之为再标记。将所有可达对象标记完成后就可以运行并发清理操作。优点是性能较高,缺点是需要更大的堆内存。

四、内存管理建议

17.尽量使用直接量:如String a=”aaa”;而不是String a=new String(“aaa”);
18.尽量使用StringBuffer与StringBuilder进行字符串操作;
19.尽早释放无用对象的引用:若一个对象在一个方法中已经没有用且之后要执行耗时操作,则在进行耗时操作前将引用对象设置为null,让垃圾回收器进行回收。
20.尽量少使用静态变量
21.尽量少的循环创建对象
22.缓存经常使用的对象
23.尽量不要使用finalize方法
24.考虑使用软引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值