垃圾回收:
垃圾回收分为年轻代,年老代,持久代。
新创建的对象属于年轻代,有A、B区,A区满了,就会调用垃圾回收机制,通过引用计数法或者引用可达法就行筛选,没有的进行回收,有用的进行复制,复制到B区。
B区满了,再重复以上操作。
循环15次之后,就会属于年老代,进入年老区,C区,当C区达到一定比例之后,也会进行一次垃圾回收,跟年轻区的垃圾回收有些差别,具体差别还不太清楚。
当年老区满了,则进行全盘清理,Full Gc。
能够触发执行全盘清理的四个条件:
年老区满了。
持久区满了。
调用System.gc()显性方法
上次全盘清理之后....(这个不太懂)
容易造成内存泄漏的操作:
创建大量无用对象。eg:对于一个需要很多次拼接的字符串,使用String,而不是StringBuilder
创建大量静态集合类
不关闭连接。eg:数据库连接、IO流
监听器的使用。
传递参数其实就是值传递,值得是将值进行复制,而不是将原值给它。但是需要注意引用对象的传递,当将一个引用对象给定另外一个值时,就相当于将该对象的地址给了另外一个值,所以两个值只要有一
个改变对象,那么对象就会被改变。
创建对象的步骤
先分配内存空间,并完成成员变量的初始化或者默认值。
执行属性值的显示初始化(系统默认的无参构造器就是隐式的,不是系统默认的就是显示的)
执行构造方法
返回对象的地址给对象
Integer对象的学习
public static void main(String[] args) {
Integer int1 = 2;
Integer int2 = 2;
Integer int3 = Integer.valueOf(222);
Integer int4 = 222;
/**
* Integer对象中存在缓存,缓存比较常见的数值,大小范围是-128-127 只要是这个范围内的数字则从缓存中拿,不在这个范围则需要new一个新对象。
*/
System.out.println(int1 == int2); //返回true
System.out.println(int3 == int4); //返回false
}
相关源码(下面源码就是Integer的缓存信息):
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}