Java的内存分配有三种,
1、静态存储区:内存在程序编译时就分配好了,比如静态变量;
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存,而在栈区存放该对象的引用。
Java程序的多个部分(方法,变量,对象)驻留在内存中以下两个位置:即堆和栈,现在我们只关心3类事物:实例变量,局部变量和对象: 实例变量和对象驻留在堆上 局部变量驻留在栈上 让我们查看一个java程序,看看他的各部分如何创建并且映射到栈和堆中:
java内存管理总结.pdf
(151.81 KB, 下载次数: 226)
- public class Dog
- {
- Collar c; String name;
- //1. main()方法位于栈上
- public static void main(String[] args)
- {
- //2. 在栈上创建引用变量d,但Dog对象尚未存在
- Dog d;
- //3. 创建新的Dog对象,并将其赋予d引用变量
- d = new Dog();
- //4. 将引用变量的一个副本传递给go()方法
- d.go(d);
- }
- //5. 将go()方法置于栈上,并将dog参数作为局部变量
- void go(Dog dog){
- //6. 在堆上创建新的Collar对象,并将其赋予Dog的实例变量
- c =new Collar(); }
- //7.将setName()添加到栈上,并将dogName参数作为其局部变量
- void setName(String dogName)
- {
- //8. name的实例对象也引用String对象
- name=dogName;
- }
- //9. 程序执行完成后,setName()将会完成并从栈中清除,此时,局部变量dogName也会消失,尽管它所引用的String仍在堆上
- }
复制代码 |