系统相关
首页 > 系统相关> > java程序内存分析

java程序内存分析

作者:互联网

java程序内存分析

文章目录

示例一

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;
    }
}
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中一个叫方法区的地方,类的成员变量与成员方法也被加载到方法区中,此时内存模型如下

img

可以看到study方法右边各有一个16进制的标记,而name与age变量没有,这是因为每个对象都有各自的成员变量,而类中的成员方法却可以被每个对象所共用,为了节省内存空间,JVM为方法分配了该标记(也叫内存地址)便于每个new出来的对象查找调用;

接着JVM会自动寻找main方法,在栈中为main方法申请一个空间,这个过程也叫入栈,然后执行我们Student类中第5行代码

img

这时候,JVM在堆空间中分配一块内存给Student对象,并为其分配一个内存地址(如果对象的成员变量没有赋值,则JVM会为变量赋初始值),在栈中分配一块内存空间用于指向堆空间中的Student对象区的内存地址,此时内存模型如下img

接着看代码第8行与第9行

程序为student对象的成员变量赋值,JVM会根据student所指向的地址在堆内存中寻找Student类的变量,并为变量赋新的值

img

img

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

img

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

img

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

img

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

img

Java程序内存的简单分析 - 不能差不多 - 博客园 (cnblogs.com)

更具体的描述:

示例二

示例三

标签:java,student,student2,程序,内存,JVM,Student,空间,public
来源: https://blog.csdn.net/qq_44689862/article/details/119222019