Java学习笔记之内存分析

2012年02月22日 分类:学习笔记Java

在上一篇《Java学习笔记之数据类型》中对Java的数据类型进行了分类,为了更好地理解他们的不同之处,我将对他们在内存中的存储进行分析。

我们先说说总的运行过程,在程序运行的时候,硬盘中的程序片段被加载到内存中,操作系统找到程序中的main方法,由此进入程序一步步执行,运行结束后操作系统释放这段内存。在这过程中最重要的就是程序执行过程中的内存分配方式,也就是内存管理。内存可以分为四个区域,如下图所示: Java内存分析 所有用new定义的数据都放在堆(heap)中,比如对象,对象被new出来后就会在堆中分配相应的空间,并由系统自动回收这部分内存,而不必像c语言一样申请到的内存必须手动释放。在栈(stack)中存放的是局部变量,局部变量就是方法或语句块内部定义的变量,他的作用域只是相对应的方法内部或语句块内部。比如在在for(int i=0;i<10;i++)这句话中的i就是一个局部变量,出了这个语句块i就不存在。数据区(data segment)存放静态数据常量,比如用static修饰的数据,系统会在数据区开辟相应空间。代码区(code segment)就是存放代码的内存区域,这个比较好理解。

举个例子,请看如下代码:

public class Test{
    Public static void main(String [] args){    
        Demo test = new Demo(3,4);
     int data = 10;
        int[] s;
        s = new int[5];  
    }   
} 

class Demo{  
    private int x;  
    private int y;  
    public static int temp = 5;  
    public Demo(int x,int y){
        this.x = x;
        this.y = y;
    }    
} 

这段程序运行后的内存分配如下图所示: Java内存分析

程序的入口是main方法,系统进入后首先Demo定义test变量,在栈中开辟test,但test里面放的并不是Demo类的成员,他只是一个引用,当系统在堆中new出一个实例后test将指向这块内存空间,这块内存里存放的才是test的成员,其中就包括x和y。Demo的另一个成员temp会放在data segment中,他是一个静态变量。也可以把test和temp看成是指针,里面存放的是指向数据的地址。data是成员变量,放在了栈中。数组s的存放过程与对象一样,先在栈中生成s,再指向堆中的一段连续的内存。

还记得上一篇中Java的数据类型可以分为基本数据类型和引用数据类型,基本数据类型一般放在栈中,还有一些类的成员变量将放在堆或数据区中,引用数据类型的话会有一个引用放在栈中,真正的数据会放在堆中,这也是引用类型这名字的由来吧。

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2012/02/java-ram