1:java中为什么使用iterator?
iterator不会立即返回所有的数据只是返回了数据集的一个引用,通过hasnext()方法判断是不是有数据,有数据就通过.next()方法获取;不会占用太多内存,如果是list或者map等数据结构会直接返回所有数据到内存中,有内存溢出的风险;
什么是内存溢出?什么是内存泄漏?
内存溢出:使用的内存超过了能提供的最大内存;导致数据加载不下;
内存泄漏:内存中有些对象占用的内存一直无法回收,垃圾回收机制无法回收该对象占用的内存空间。所以有一部分内存空间相当于无法使用丢失一样;
内存泄漏:就需要提到java中的内存回收机制,gc:gabbage collect;首先我们需要明确的一点就是java与c语言在内存管理中不一样,c语言是需要手动来管理内存但是java提供了内存管理机制无需我们手动回收内存;接着思路:java jvm是怎么帮我回收垃圾的呢?
我们常见的一个场景就是我们创建一个对象时就会在内存中开辟一个空间用来存储这个对象,那这个对象的内存空间什么时候回收呢?
这个需要判断该对象是不是还有引用?引用是指什么?简单理解为还有没有其它对象在引用这个对象,有的话说明该对象还有意义不能随便回收。上面的说法也叫对象的生命周期,上面意思在换个说法就是一个对象死了就可以被gc回收了;怎么判断一个对象是不是还有存活的价值?
其实jvm使用一种叫做有向无环图方式来标记每个对象,当某个对象通过搜索后无法到达则说明该对象已经无存在必要,则会进行回收该对象占用的空间。
内存泄漏的例子:
public class dem{
Object object;
public void method1(){
object =new Object();
xxx
xx
}
}
public class demo{
Object object;
public void method1(){
object =new Object();
xxx
xx
object=null;
}
}
第二种方式就解决了上面的内存泄漏的隐患;