APP下载

基于简单实例的java内存解析

2018-12-21黎梨苗刘欣

新教育时代·教师版 2018年36期
关键词:常量数据类型李四

黎梨苗 刘欣

摘 要:Java程序中,java虚拟机将内存分成了两大部分,每部分的功能不同,这与我们通常所说的内存有着一定的区别。那么,java虚拟机是如何进行内存的分功的呢?本文将结合简单实例对java程序中的内存进行详细解析。

關键词:java虚拟机内存栈内存堆内存

Java程序中的内存分为两大部分:一部分叫做栈(Stack)内存,另一部分叫堆(heap)内存。栈内存用来存放基本数据类型和引用数据,基本数据类型如int,short,byte,float等;引用数据类型如类,接口,注解等。堆内存用来存放类中的实例化对象即用new关键字创建的对象,如 new animal(),这个数据就存放堆内存里。通过一个简单实例对两部分内存做详细分析。[1]

一、简单实例

class Student{

int age;String name;

Student (int age,String name){

this age=age;String name=name;}

void listening(){

System.out.print(“学生正在听课”);}

public static void main(String[] args){

Student stu1=new Student(8,”张三”);

Student stu1=new Student(12,”李四”);

stu1.listening();}}

二、实例内存分配解析

上述实例中,定义了两个基本数据类型的变量age与name;一个一般方法;在主函数内创建了两个对象。内存分配解析如下:

栈内存用来存放基本数据类型的变量及对象的引用地址,在实例中的基本数据类型为int age、String name; 对象的引用为 Student stu1、Student stu2.而堆内存用来存放new出来的对象即存放上例中的new Student(8,”张三”)与new Student(12,”李四”),如图中所示。另外,通常在堆内存又细分出一块内存空间叫常量池,用来存放不常改变的量,如static修饰的量,final修饰的量,字符串常量及方法,显然,常量池里所存放的内容具有所有实例共享的特征。实例内存分配如图1所示。[2]

三、内存运行机制

在讲内存运行机制之前,我们首先必须了解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读到下面两条语句时,

Student stu1=new Student(8,”张三”);

Student stu1=new Student(12,”李四”);

检测到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中内存机制运行的介绍。

结语

栈内存的数据和堆内存的数据不是同步释放的。方法结束时,栈中的局部变量立即释放,但是堆中对象不一定释放。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才释放,并且还不是马上释放,要等垃圾回收扫描时才可以被释放。

参考文献

[1]章婧,卢凯,周旭,Java内存行为研究,小型微型计算机系统,2011, 32(8):1617-1621.

[2]李杰文,Java程序内存使用分析技术研究,中国矿业大学,2016,10(12):32-37.

[3]彭天昊,JAVA语言内存分配的探讨,凯里学院学报,2009, 27(6):93-95.

猜你喜欢

常量数据类型李四
科学照亮世界
——卡文迪什测定万有引力常量
详谈Java中的基本数据类型与引用数据类型
如何理解数据结构中的抽象数据类型
你追我赶
熟人就是这样变成陌生人的
李四超前
基于SeisBase模型的地震勘探成果数据管理系统设计
低氧低分压环境下泡塑吸附火焰原子吸收光谱法测定常量金
范畴数据类型上的子类型*
论常量函数的充分必要条件