本文是自己在复习java基础知识时对内存管理部分进行的一点小小的梳理,有不对的地方还望各位大神指点,欢迎分享。
1.内存泄漏:由于某种原因使分配的内存始终没有得到释放。如果该任务不断的重复,程序最终会耗尽内存并异常终止,至少无法运行。Java不要求程序员显示分配内存和释放内存,当创建对象时会自动分配内存,当该对象的引用不存在时释放该内存。在java中,内存泄漏:1)对象可达,即在有向图中,存在通路可以与其相连;2)对象是无用的,即程序以后不会再使用这些对象。如果满足这两个条件,这些对象就可以判定为Java中的内存泄漏。在Java中,GC线程的优先级别较低。
2.Java中使用垃圾收集器技术来监视程序的运行状态。这里会引用一种叫软指针(不直接指向对象,而是指向对象的引用)的概念。Java使用软指针来跟踪对象的各个引用,并用一个对象表将这些软指针映射为对象的引用,使用软指针,垃圾收集器能够以单独的线程在后台运行,并依次检查每个对象。通过更改对象表项,垃圾收集器可以标记对象,移除对象,移动对象或检查对象。
3.垃圾收集器是自动运行的,一般情况下,无需显示的请求垃圾收集器,程序运行时,垃圾收集器会不时检查对象的各个引用,并回收无引用对象所占用的空间。调用System类中的静态方法gc()可以运行垃圾收集器,但并不能保证立即回收指定对象。
4.Java垃圾回收机制:gc即垃圾回收机制,是指JVM用于释放那些不再使用的对象所占的内存。Java的垃圾回收机制是为所有的进程服务的,而不是为了某个特定的进程服务,因此任何一个进程都不能命令垃圾回收机制做什么,怎么做,做多少。在垃圾回收器收集一个对象之前,一般要求程序调用适当的方法释放资源,这个方法就是finalize()。原型是protected void finalize() throws Throwable。在该方法返回之后,对象消失,垃圾回收器开始执行。
5.在Java中程序员通过使用new关键字申请内存空间,所有的对象都在堆中分配空间,释放是由GC决定和执行。正因为如此,加重了JVM的负担,这就造成了java程序运行较慢(原因之一)。因为GC要监控每一个对象的运行状态,包括对象的申请,引用,被引用和赋值等。
堆栈:
1.Java中把内存划分为2种,一种是栈内存,一种是堆内存。栈:存取速度比堆快,仅次于直接位于CPU中的寄存器,但缺点是存在于栈中的数据大小与生存周期必须是确定的,缺乏灵活性,另外栈数据可以共享。堆:动态分配内存大小,生存周期也不必事先告诉编译器,java垃圾收集器会自动收走这些不再使用的数据。缺点是,由于要在运行时动态分配内存,存取速度慢。
2.8种基本数据类型(int, short, long, byte, float, double, boolean, char)是存在于栈中,而且还有数据共享的功能。int a = 3;int b = 3;这里在栈中只存在一个3,而且a = 4,也不会影响b的值,b还是3.对于String str = "abc";同样适用,但不适用于String str = new String("abc");
3.栈主要存放一些基本数据类型的变量和对象句柄(对象的引用)。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
4.我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str,不一定,因为如果事先没有,那么就会创建,如果原来就有,那就指向那个原来的对象就可以了!只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
注:更加深入的垃圾回收以及内存管理机制参考印象笔记中的相关笔记。
网友评论