1. Java 中是值传递还是引用传递?
但是传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是
传值,所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引
用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,
被程序解释(或者查找)到堆中的对象,这个时候才对应到真正的对象。如果此时进行修
改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修
改是可以保持的了。
对象,从某种意义上说,是由基本类型组成的。可以把一个对象看作为一棵树,对象的属
性如果还是对象,则还是一颗树(即非叶子节点),基本类型则为树的叶子节点。程序参
数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点
(即一个对象引用),则可以修改这个节点下面的所有内容。
2. 引用类型
对象引用类型分为强引用、软引用、弱引用和虚引用。
强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严
格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收
软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机
会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚
拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,
虚拟机在发生 OutOfMemory 时,肯定是没有软引用存在的。
弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾
回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。
强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。
他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果
内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见
的是被使用在桌面应用系统的缓存。
3. 基本垃圾回收算法
3.1 按照基本回收策略分
3.1.1 引用计数(Reference Counting):
比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少
一 个计数。垃圾回收时,只用收集计数为 0 的对象。此算法最致命的是无法处理循环引用
的问题。
3.1.2 可达性分析清理