服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 详解Java 中程序内存的分析

详解Java 中程序内存的分析

2020-09-16 15:43Java之家 Java教程

这篇文章主要介绍了详解Java 中程序内存的分析的相关资料,需要的朋友可以参考下

这篇文章将简单的说明下当我们运行java程序时jvm(java虚拟机)的内存分配情况。

首先我们先来感观的认识下几个名词:

1、栈,一般来说,基本数据类型直接在栈中分配空间,局部变量(在方法代码段中定义的变量)也在栈中直接分配空间,当局部变量所在方法执行完成之后该空间便立刻被jvm回收,还有一种是引用数据类型,即我们通常所说的需要用关键字new创建出来的对象所对应的引用也是在栈空间中,此时,jvm在栈空间中给对象引用分配了一个地址空间(相当于一个门牌号,通过这个门牌号就可以找到你家),在堆空间中给该引用的对象分配一个空间,栈空间中的地址引用指向了堆空间中的对象区(通过门牌号找住址);

2、堆,一般用来存放用关键字new出来的数据。

接下来我们再通过一段程序来直观感受下程序运行时jvm的内存情况,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package demo;
 
public class student {
  private string name;
  private int age;
 
  public void study() {
    system.out.println("i love study!");
  }
 
  public string getname() {
    return name;
  }
 
  public void setname(string name) {
    this.name = name;
  }
 
  public int getage() {
    return age;
  }
 
  public void setage(int age) {
    this.age = age;
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package demo;
 
public class studentdemo {
  public static void main(string[] args) {
    student student = new student();
 
    system.out.println(student.getname() + ":" + student.getage());
    student.setname("john");
    student.setage(23);
    system.out.println(student.getname() + ":" + student.getage());
    
    student.study();
    
    student student2 = student;
    student2.setname("jack");
    student2.setage(25);
    system.out.println(student2.getname() + ":" + student2.getage());
    system.out.println(student.getname() + ":" + student.getage());
  }
}

当我们运行程序时,jvm会把student类与studentdemo类编译完然后加载到jvm中一个叫方法区的地方,类的成员变量与成员方法也被加载到方法区中,此时内存模型如下

详解Java 中程序内存的分析

可以看到study方法右边各有一个16进制的标记,而name与age变量没有,这是因为每个对象都有各自的成员变量,而类中的成员方法却可以被每个对象所共用,为了节省内存空间,jvm为方法分配了该标记(也叫内存地址)便于每个new出来的对象查找调用,接着jvm会自动寻找main方法,在栈中为main方法申请一个空间,这个过程也叫入栈,然后执行我们student类中第5行代码,这时候,jvm在堆空间中分配一块内存给student对象,并为其分配一个内存地址(如果对象的成员变量没有赋值,则jvm会为变量赋初始值),在栈中分配一块内存空间用于指向堆空间中的student对象区的内存地址,此时内存模型如下

详解Java 中程序内存的分析

接着看代码第8行与第9行,程序为student对象的成员变量赋值,jvm会根据student所指向的地址在堆内存中寻找student类的变量,并为变量赋新的值

详解Java 中程序内存的分析

第12行,这时student对象调用study方法,jvm在栈空间中为study方法申请了一块内存空间

详解Java 中程序内存的分析

study方法执行完后,立即释放栈空间,代码第14行,student2对象的引用指向了student所指向的地址

详解Java 中程序内存的分析

代码15与16行,为student2的变量赋值,由于student2与student指向了同一个地方,所以这时student对象中变量的值也被改变

详解Java 中程序内存的分析

到这,main方法中所有代码执行完毕,main方法所占用的栈空间也被回收,而堆空间等待gc回收

详解Java 中程序内存的分析

代码执行结果如下:

?
1
2
3
4
5
null:0
john:23
i love study!
jack:25
jack:25

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/lin353809836/article/details/69367482

延伸 · 阅读

精彩推荐