星期二, 十二月 08, 2015 ?21:20:12
?
对象内存管理
?
一、对象内存管理
? ? ? ?1.编译好的java程序需要运行在jvm中。
? ? ? ?2.程序,无论代码还是数据,都需要存储在内存中。
? ? ? ? ? ?jvm为java程序提供并管理所需要的内存空间。
? ? ? ? 3.jvm内存分为“堆”、“栈”、“方法区”三个区域,分别用于存储不同的数据。
?
二、堆内存
?
? ? 1.对象存储在堆中
? ? ? ? ?1.1 jvm在其内存空间开辟一个称为“堆”的存储空间;
? ? ? ? ?1.2这部分空间用于存储使用new关键字所创建的对象。
? ? 2.成员变量的生命周期
? ? ? ? ?2.1 访问对象需要依靠引用变量
? ? ? ? ?2.2当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围。
? ? ? ? ? ? ? 该对象中的所有成员变量也随之被收回。
? ? 2.3成员变量的生命周期为:
? ? ? ? ?从对象在堆中创建开始到对象从堆中被收回结束。
? ? ? ? ?Cell c = new Cell();
? ? ? ? ?c = null;//不再指向刚分配的对象空间,成员变量失效。
?
? ?3.垃圾回收机制
?
? ? ? ? 3.1垃圾回收器GC,是jvm自带一个线程(自动运行着的程序),用于回收没有任何指向的对象。
? ? ? ? 3.2java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。
?
? ? 4.java程序中的内存泄露问题
? ? ? ? ? 4.1内存泄露是指: 不再使用的内存没有被及时回收。严重的内存泄露会因过多的内存占用而导致程序的崩溃。
? ? ? ? ? 4.2GC线程判断对象是否可以回收的依据是否有引用指向,因此,当确定该对象不再使用时,
? ? ? ? ? ?应该及时将其引用设置为null。
?
? ?5.System.gc()方法
? ? ? ? 5.1 GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收。
? ? ? ? 5.2 一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。
? ? ? ? 5.3System.gc()用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统。
?
三、栈
?
1.栈用于存放方法中的局部变量
? ? ? ? ?1.1 JVM在其内存空间开辟一个称为"栈"的存储空间;
? ? ? ? ? 1.2这部分空间用于存储程序运行时在方法中声明的所有局部变量。
? ? ? ? 例如:main()方法中有以下代码:
? ? ? ? ? Cell c = new Cell();
? ? ? ? ? int num = 5;
? ? ? ? 栈内存: 5,40DF ? 堆内存:被40DF指向的对象
?
2.局部变量的生命周期
? ? ? ? 2.1一个运行的java程序从开始到结束会有多次方法的调用,
? ? ? ? jvm会为每一个方法的调用在栈中分配一个对应的空间,这个空间被称为该方法的栈帧。
? ? ? ? 2.2一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
? ? ? ? 当某一个方法调用完成后,其对应的栈帧将被清除,局部变量失效。
?
3成员变量和局部变量
? ? ? ? 3.1差别:
? ? ? ? ? ? 3.1.1 局部变量
? ? ? ? ? ? ? 定义在方法中; 没有默认值,必须自行设定初始值;方法调用时,存在栈中,方法调用结束,从栈中清除。
? ? ? ? ? ? 3.1.2成员变量
? ? ? ? ? ? ?定义在类中,方法外;有默认初始值,可以不显示初始化;所在类被实例化后,存在堆中,对象被回收时,成员变量失效。
?
四、方法区
?
1. 方法区用于存放类的信息
? ? ? ? ? 1.1方法区用于存放类的信息,java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。
? ? ? ? ? ? ? ? ? 类的各种信息(包含方法)都在方法区存储。
? ? ? ? ?1.2.Cell c = new Cell();Cell类首先被装载到jvm的方法区,其中包括类的基本信息和方法定义等。
?
2.方法只有一份
? ? ? ? ?2.1当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;
? ? ? ? ?2.2类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例化对象时共用在方法区中的一份方法定义的。
?
星期二, 十二月 08, 2015 ?21:56:31?
?
原文:http://yuzhouxiner.iteye.com/blog/2262742