基于简单实例的java内存解析
2018-12-18
(长沙学院计算机工程与应用数学学院 长沙 410075)
Java程序中的内存分为两大部分:一部分叫做栈(Stack)内存,另一部分叫堆(heap)内存。栈内存用来存放基本数据类型和引用数据,基本数据类型如int,short,byte,f l oat等;引用数据类型如类,接口,注解等。堆内存用来存放类中的实例化对象即用new关键字创建的对象,如 new animal(),这个数据就存放堆内存里。通过一个简单实例对两部分内存做详细分析。[1]
一、简单实例
二、实例内存分配解析
上述实例中,定义了两个基本数据类型的变量age与name;一个一般方法;在主函数内创建了两个对象。内存分配解析如下:
栈内存用来存放基本数据类型的变量及对象的引用地址,在实例中的基本数据类型为int age、String name; 对象的引用为 Student stu1、Student stu2.而堆内存用来存放new出来的对象即存放上例中的new Student(8,”张三”)与new Student(12,”李四”),如图中所示。另外,通常在堆内存又细分出一块内存空间叫常量池,用来存放不常改变的量,如static修饰的量,f i nal修饰的量,字符串常量及方法,显然,常量池里所存放的内容具有所有实例共享的特征。实例内存分配如图1所示。[2]
图1 JAVA程序内存划分图
三、内存运行机制
在讲内存运行机制之前,我们首先必须了解JVM即Java虚拟机,Java程序是在JVM上运行的,它是连接操作系统与Java程序之间的纽带,Java程序有个特点“一次编译,到处运行”,这正是JVM所起的作用,体现了Java的平台无关性,可见,JVM在Java程序运行中起着至关重要的作用,程序的内存分配都是在JVM中进行。现结合上述简单实例将Java的内存运行机制讲述如下:
计算机把class student整个程序信息调入计算机内存,一旦运行程序时,JVM开始对class student整个信息进行内存分配;
1.程序运行时,JVM自动寻找main方法,执行第一句代码,创建两个student类的对象,在栈中分配一块内存,存放两个指向堆内存的对象指针215346和140345。
2.JVM读到下面两条语句时,
检测到age,name是局部变量,因此会把age,name放在栈中,把对象指针指向堆内存的内容即把相应的“8,张三”与“12,李四”赋给age与name.[3]
3.当上面两条语句执行完了,JVM立即释放变量ageg与name;但stu1与stu2还在堆中,并没有释放掉,因为可能还有其他变量指向这两个变量。
4.JVM继续读取语句stu1.listening();这时从常量池中调用listening()方法给stu1对象来完成操作,JVM完成对象stu1对listening()方法的算法计算。由于listening()方法是存放于常量池中供所有类对象共享的,因此,JVM运行完语句stu1.listening()后,listening方法依旧在常量池中。
以上就是Java中内存机制运行的介绍。
结语
栈内存的数据和堆内存的数据不是同步释放的。方法结束时,栈中的局部变量立即释放,但是堆中对象不一定释放。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才释放,并且还不是马上释放,要等垃圾回收扫描时才可以被释放。