首页 > 系统相关 >一篇教会你java内存图怎么画

一篇教会你java内存图怎么画

时间:2023-07-20 12:11:07浏览次数:34  
标签:java 一篇 void Person m1 内存 m3 m2 public

  首先我们要知道:
  • 线程的本质是
  • 程序执行时,在java栈中,成立一个线程栈,调用方法时方法不断压栈出栈,这个压栈出栈的过程就是线程执行的过程
  • 方法执行 拷贝入栈 ,执行完成 出栈,从第一个线程入栈开始到最终出栈,就是一个线程的过程。
0    

java内存图

以下段代码为例画内存图
public class Test {
    public static void main(String[] args) throws Exception {
        Person x1 = new Person();
        Person x2 = new Person();
        Person x3 = new Person();
        m1();
        x1.m1();
    }
        public static void m1(){
            m2();
        }
        public static void m2(){
            m3();
        }
        public static void m3(){
            Person x1=new Person();
            x1.m2();
        }
        public static void m4(){

        }
    }
public class Person {
    
    public void m1() {
    }
    public void m2() {
        m3();
    }
    public void m3() {
    }
}

 

1、java文件在硬盘上,通过编辑器编译为.class文件,类信息文件首先加载进方法区中。

0  

2、我们有Person类和Test类,将这些类信息加载到方法区,对于Test中的5个静态方法main \ m1 \ m2 \ m3 \ m4会在方法区额外开辟一块地方存放,即静态域

0

3、首先主方法执行, 主方法被拷贝一份入栈。

  3.1、Person x1=new Person() ,Person x2=new Person(),Person x3=new Person()new出来的对象在方法堆中。

  3.2、变量后边的数字表明的是对应地址

0

  3.3、如果Person类中加入变量怎么画? -- 一样的道理

  • 只需要在方法区Person内加入变量,new出来到堆里也增加相应变量就行了
public class Person {
    public int age;
    public String name;
    public void m1() {
    }
    public void m2() {
        m3();
    }
    public void m3() {
    }
}
0  

  3.4、如果Person类中添加静态方法呢?

  • 静态属性需要在方法区内的静态域存放
  • static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改
  • 注意new出来放入堆中的对象属性,不管是变量还是方法都是非静态的
public class Person {
    public int age;
    public String name;

    public void m1() {
    }
    public void m2() {
        m3();
    }
    public void m3() {
    }

    public static void m4() {
    }
}
0  

4、接着调度m1(),m1()拷贝入栈;m1()中调度m2(),m2()拷贝入栈;m2()中调度m3(),m3()拷贝入栈;

5、m3()中new了个对象x1,这个对象在堆中创建

6、x1调度了方法m2(),x1对象内的m2()拷贝入栈(注意是从堆那边拷贝入栈)

0

7、接着x1调度了方法m2(),但m2()方法内调度了m3(),m3()拷贝入栈;

0

8、m3运行完后出栈,m2方法是调度m3,运行完后也出栈

9、接下来是T.m3(),已经运行完了也出栈,同时创建的对象x1也会被销毁;

10、在堆中的x1对象由于地址没有被记录了,也随之销毁

0 0

11、接着调度m3的m2()完成任务后也出栈

12、调度m2的m1()完成任务后也出栈

0

13、m1()完成后,主方法内还有x1.m1() 待执行;

14、将x1的m1()拷贝入栈

0

15、x1.m1() 执行完后,m1()出栈

16、这时主方法已经全部执行完毕,主方法出栈

17、主方法内的变量销毁,以及堆中对应的对象没有地址指向后也随之销毁

0 这就是java执行过程的内存图。

标签:java,一篇,void,Person,m1,内存,m3,m2,public
From: https://www.cnblogs.com/nliu/p/17567978.html

相关文章

  • JavaScript学习 -- Promise的使用
    在JavaScript中,Promise是一种用于处理异步操作的对象。它表示某个异步操作的最终完成或失败,并提供了一种优雅的方式来处理异步操作的结果。本文将介绍JavaScript如何使用Promise,并提供一个实际的例子。什么是PromisePromise是一种异步操作的解决方案,它有三种状态:pending(等待)、re......
  • java 拆分数字
    publicclassMyInteger{//System.out.println(NumberAt(998156452,4));//返回6publicstaticintNumberAt(Integernum,intunit){if(unit==1)returnnum%10;intafter=1;while(--unit>0)after*=10;intre......
  • 基于JAVA的房屋租赁及其管理系统
    本房屋租赁及其管理系统是针对目前房屋租赁管理的实际需求,从实际工作出发,对过去的房屋租赁管理系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构和java中流行的MVC三层设计模式和myeclipse编辑器、sqlserver数......
  • 43基于java的校园社团管理系统设计与实现
    本章节给大家带来一个基于java的校园社团管理系统设计与实现,可适用于校园社团管理系统,社团招新管理系统,社团管理系统,社团活动管理系统,高校学生社团,大学社团,学生社团招新,学生社团系统等等;引言校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团规......
  • Java-Log框架
    java日志SLF4j是日志门面api,log4j、log4j2、logback才是真正的日志实现库。各个库单独使用1log4j<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>classpath下配置文件log4j.pr......
  • Java详解ThreadLocal
    threadlocal1基础现象:threadlocal作为一个全局变量,在不同的线程去get的时候能够获取不同的值。应用场景:SimpleDateFormat线程不安全,每个线程都要用,new太多,放到threadlocal中线程池可反复使用。一个请求链路很长,经过数个服务,每次都要放到参数带着。改为直接放到threadlocal作为上下......
  • Java开发工具MyEclipse发布v2023.1.2,今年第二个修复版!
    MyEclipse一次性提供了巨量的Eclipse插件库,无需学习任何新的开发语言和工具,便可在一体化的IDE下进行JavaEE、Web和PhoneGap移动应用的开发;强大的智能代码补齐功能,让企业开发化繁为简。MyEclipsev2023.1.2官方正式版下载更新日志如下:v2023.1.2是MyEclipse2023的一个小错误修......
  • Java各种注解
    @EnableConfigurationProperties({MinIOConfigProperties.class})将@ConfigurationProperties标记的类作为Bean注入到容器中,也可以在原来的@ConfigurationProperties上继续加@Component,相当于吧@ConditionalOnClass(FileStorageService.class)表示有这个类时才会注入spring容器......
  • Javascript和jQuery有什么不同?
     Javascript和jQuery都是前端开发必备的语言和框架,但他们之间有很多不同。下面我们来详细的分析一下。Javascript是一种脚本语言,可以在浏览器端直接运行。它的语法简单,可以操作HTML和CSS,实现动态效果,如表单验证、动态创建元素等。Javascript的核心是ECMAScript标准,它定义了语......
  • JavaScript和Java如何进行通信
     JavaScript和Java是两种不同的编程语言,但是它们可以通过一些技术手段进行通信。在Web开发领域,JavaScript和Java的交互性十分重要,因为它们可以实现复杂的交互操作和数据处理,为Web应用程序带来更好的用户体验。一、Java与JavaScript的通信方式1.JavaappletJavaapplet是一......