常规面试题-7.JAVA平台和内存管理

来源:互联网 发布:淘宝团队管理 编辑:程序博客网 时间:2024/05/17 21:48

1.Java是否存在内存泄漏问题

在JAVA中,判断一个内存空间是否符合垃圾回收的标准是2个:
第一,给对象赋空null值,以后再没有使用过
第二:给对象赋了新值,重新分配了内存空间。
一般来说,内存泄漏主要有两种情况:
1.在堆中申请的空间没有被释放。
2.对象已不再被使用,但还仍然在内存中保留着。
一般来说,垃圾回收机制可以有效处理第二种情况。
在JAVA中引起内存泄漏的情况有很多:
1.静态集合类:例如HashMap和Vector。如果这些容器为静态的,由于它们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
2.各种链接,例如数据库连接,网络连接以及IO连接等。在对数据库进行操作过程中,首先需要建立与数据库连接,当不再使用时,需要调用close方法来释放与数据库连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。
3.监听器:在Java语言中,往往会使用到监听器。通常一个应用中会用到多个监听器,但在释放对象的同时往往没有释放监听器,这也可能导致内存泄漏。
4.变量不合理作用域
5.单例模式可能造成内存泄漏。

2.JAVA中的堆和栈

1.栈内存主要用来存放基本数据类型与引用变量。
2.堆内存用来存放运行时创建的对象。
栈内存的管理是通过压栈和弹栈操作来完成的,以栈帧为基本单位来管理程序的调用关系,每当有函数调用时,都会通过压栈方式创建新的栈帧,每当函数调用结束后通过弹栈的方式来释放栈帧。
一般来说,通过new关键字创建出来的对象都放在堆内存中。由于JVM是基于堆栈的虚拟机,而每个JAVA程序都运行在一个单独的JVM实例上,每一个实例对应一个堆,一个JAVA程序内的多个线程也就运行在同一个JVM实例上,因此这些线程之间会共享堆内存,因此,多线程在访问堆中的数据时需要对数据进行同步。
从堆和栈的功能以及作用来比较,堆主要用来存放对象的,栈主要用来执行程序的。相较于堆,栈的存取速度更快,但栈的大小和生存期必须是确定的,因此缺乏一定灵活性。而堆可以在运行时动态地分配内存,生存期不用提前告诉编译器,但这也导致了存取速度的缓慢。

0 0