对象内存管理

对象内存的管理

编译好的Java程序需要运行在JVM虚拟机中。

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

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


方法区

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

方法只有一份

当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;
类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有同一个类的实例对象是共用在方法区中的一份方法定义的。

如:

JFrame f1 = new JFrame();
JFrame f2 = new JFrame();
f1.setSize(200,300);
f2.setSize(300,400);

setSize()方法只有一份,只是被两个对象分别调用。

JVM在其内存开辟一块 栈 的存储空间。

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

例如:

Cell c = new Cell();
int num = 10;

栈

局部变量的生命周期

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

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

成员变量和局部变量

差别:

局部变量:

– 定义在方法中;

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

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

成员变量:

– 定义在类中,方法外;

– 有默认初始值,可以不显式初始化;

– 所在类被初始化后,存在堆中,对象被回收时,成员变量失效;

堆 内存

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

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

成员变量的生命周期

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

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

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

如:

Cell c = new Cell();
c = null;

当c不在指向刚分配的空间,成员变量失效

垃圾回收机制

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

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

但是,GC线程判断对象是否可以回收的依据是该对象是否有引用指向,当对象不在使用却还占着内存,随着对象的越来越多并没有被回收(还有引用指向,但是已经不再使用该对象),就会发生内存泄漏。

内存泄漏:不再使用的内存没有被及时的回收。严重的内存泄露会因过多的内存占用而导致程序的崩溃。

所以应当在对象不再使用时,给对象设置为null,等待GC回收处理/或者调用System.gc( )方法立刻回收。

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

/堆

标签: Java, 内存, 方法, 回收, 对象, JVM, 局部变量

相关文章推荐

添加新评论,含*的栏目为必填