文档详情

Java基础课-对象内存管理3.pptx

发布:2017-02-04约2.85千字共17页下载文档
文本预览下载声明
JAVA 基础课程-对象内存管理-唐 霞JAVA 基础课程-对象内存管理编译好的Java程序需要运行在JVM中。程序,无论代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间。JVM内存分为“堆”,“栈”和“方法区”三个区域,分别用于存储不同的数据。 对象内存管理栈方法区堆JAVA 基础课程-对象内存管理JVM在其内存空间开辟一个称为“堆”的存储空间;这部分空间用于存储使用new关键字所创建的对象。 对象存储在堆中JAVA 基础课程-对象内存管理访问对象需要依靠引用变量。当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围。该对象中的所有成员变量也随之被回收。成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束。 Cell c =new Cell(); c=null; //不再指向刚分配的对象空间,成员变量失效 成员变量的生命周期JAVA 基础课程-对象内存管理垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象。Java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。 垃圾回收机制JAVA 基础课程-对象内存管理内存泄露是指,不再使用的内存没有被及时的回收。严重的内存泄露会因过多的内存占用而导致程序的崩溃。GC线程判断对象是否可以回收的依据是该对象是否有引用指向,因此,当确定该对象不再使用时,应该及时将其引用设置为null. Java程序的内存泄露问题JAVA 基础课程-对象内存管理 一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。 Java程序的内存泄露问题-举例JAVA 基础课程-对象内存管理FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。? 要避免这种情况下的内存泄露,要求我们以C/C++的内存管理思维来管理自己分配的内存。第一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为local变量,与类实例生命周期相同的要声明为实例变量,以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。? Java程序的内存泄露问题-举例JAVA 基础课程-对象内存管理GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收。一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。System.gc()用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统。 System.gc()方法JAVA 基础课程-对象内存管理public static void main(String[] args) throws Exception { System.gc(); ListObject list = new ArrayListObject(); for(int i = 0;i10;i++){ list.add(new Demo2(i)); } list = null; System.gc(); Thread.sleep(1000); System.out.println(******************+j);}public class Demo2 { int i ; static int j; public Demo2(){ } public Demo2(int i) { this.i = i; } @Override protected void finalize() throws Throwable { j++; System.out.println(Over+i+-+this.hashCode()); super.finalize(); }} System.gc()方法-举例JAVA 基础课程-对象内存管理JVM在其内存空间开辟一个称为“栈”的存储空间;这部分空间用于存储程序运行时在方法中声明的所有局部变量。例如:main()方法中有如下代码:Cell c =new Cell();in
显示全部
相似文档