对象内存管理

对象内存管理

1)编译好的Java程序需要运行在JVM中。

2)程序,无论代码还是数据,都需要存储在内存中。为Java程序提供并管理所需要的内存空间,

3)JVM内存分为“堆”,“栈”,“方法区”三个区域,分别用于存储不同的数据。

堆内存

对象存储在堆中

1)JVM在其内存空间开辟了一个称为“堆”的存储空间;

2)这部分空间用于存储使用new关键字所创建的对象。

成员变量的生命周期

1)访问对象需要依靠引用变量。

2)当一个对象没有任何引用,被视为废弃的对象,属于被回收的范畴。该对象中的所有成员变量也随之被回收。

3)成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束。

Cell  c=new Cell();

c=null;  //不在指向刚分配的对象空间,成员变量失效。

垃圾回收机制

1)垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象。

2)Java程序员不用担心内存管理,因为垃圾回收器自动进回收管理。

Java程序的内存泄漏问题

1)内存泄漏是指,不在使用的内存没有被及时回收。严重的内存泄漏会因过多的内存被占用而导致程序的崩溃。

2)GC线程判断对象是否可以回收的依据是该对象是否被引用指向,因此,的那个确定该对象不再使用时,应该及时将其引用设置为null。

System.gc()方法

1)GC的回收对程序员来书是透明的,并与一定一发现引用的对象,就立即回收。

2)一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。

3)System.gc()用于建议虚拟机马上调度GC线程回收具体的实现策略取决于不同的JVM系统,

 栈

栈用于存放发那个发中的局部变量

1)JVM在其内存空间开辟一个成为“栈”的存储空间

2)这部分空间用于存储程序运行时在方法中声明的所有局部变量,。

3)对象的引用

局部变量的生命周期

1)一个运行的Java程序从开始到结束会有多次方法的调用,JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。

2)一个栈帧对应一个正在调用的方法,栈帧中存储了该方法的参数,局部变量等数据。的某一个方法调用完成后,其对应的栈帧将被清除,局部变量失效。

成员变量和局部变量

成员变量和局部变量的差别如下:

局部变量:

1)定义在方法中;

2)没有默认值,必须自行设定初始值;

3)方法被调用时,存在栈中,方法调用结束,从栈中清除;

成员变量:

1)定义在类中,方法外;

2)有默认初始值,可以不显示初始化;

3)所在类被实例化后,存在堆中,对象被回收时,成员变量失效;

方法区

方法区用于存放类的信息

1)方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区中存储;

Cell c=new Cell();

//Cell类首先被装载到JVM的方法区,首先包括类的基本信息和方法定义等。

方法只有一份

1)当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;

2)类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有的实例对象是在方法区中的一份方法定义的。(只有一份)

JFrame f1=new JFrame();
JFrame f2=new JFrame();
f1.setSize(200,300);
f2.setSize(300,400);
//setSize方法只有一份,分别针对f1指向的对象和f2指向的对象调用了两次。

 

posted on 2017-08-21 11:14  左夕  阅读(106)  评论(0)    收藏  举报

导航