面试笔试整理
1.什么是内存泄漏
一句话:对象被创建了,占用了内存,但是JVM的垃圾回收却无法回收这些内存!
比如说在这段代码中
Vector vt = new Vector();
for(int i=0;i<10;i++){
Object o = new Object();
vt.add(o);
o = null;
}
o = null仅仅是释放的了这个引用本身,但是这个对象仍然被放在vt中,所以这个对象对GC来说是不可回收的.
如果要回收,需要把这个对象从vt中删除,或者直接把vt设置为null.
2.递归和循环的异同
| 概念 | 原理 | 内存 | 结构 | |
| 递归 | 直接或间接调用自身的算法 |
递归函数的内部执行过程 一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。 (1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址; (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈; (3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 |
因为递归是调用本身,程序要为每一个函数都开辟一个空间,那么多次调用本身,就会开辟有多个内存空间,从而也造成了效率低下 | 代码架构简单易懂,但是因为内存花销大,导致效率低 |
| 循环 | 在某个条件下,重复执行一段代码 | 开辟一个方法的内存空间即可 | 代码相对复杂,效率高 |
3.缓存
缓存是一种数据结构,用于快速查找已经执行的操作结果。
什么时候需要使用缓存:对于一些经常操作的结果,把它们缓存起来,下次要使用时,直接取出即可。
缓存一般使用的算法如下:
1.检查一下结果在缓存中有没有,如果有,直接取出使用。
2.如果没有结果在缓存中,就结算结果。
3.如果缓存中所占资源过大,就把时间最久的结果清除。
4.将2中计算的结果添加到缓存中去,以便下次调用。

浙公网安备 33010602011771号