Java 程序执行过程的内存分析

简介: Java 程序执行过程的内存分析

内存分析先知

栈:

1、每个线程私有,不能实现线程间的共享!

2、局部变量放置于栈中。

3、栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆:

1、放置new出来的对象!

2、堆是一个不连续的内存空间,分配灵活,速度慢!

方法区:

1、被所有线程共享!

2、用来存放程序中永远不变或唯一的内容。(类代码信息、静态变量、字符串常量)

image

注:常量池具有共享的机制,不同类的常量池之间共享数据。比如:Student 类常量池下有个 "老叶"字符串常量,那么当 Test 类中用到"老叶"这个字符串常量时就会去方法区的其他类的常量池中找,刚好 Student 类有,所以它直接就引用Student 类的"老叶"

开始分析
Student 类

public class Student {
  //静态的数据
  String name;
  int id;    //学号
  int age;
  String gender;
  int weight;

  //动态的行为
  public void study(){
      System.out.println(name+"在学习");
  }
  public void sayHello(String sname){
      System.out.println(name+"向"+sname+"说:你好!");
  }

}

Test1类

重点:注意看代码里的注释,我把每一条的语句的执行过程都做了很详细的讲解

public class Test1 {

  public static void main(String[] args) {
      //去方法区找Student类,发现没有,通过Class Loader(类加载器)加载Student类,将Student类加载到方法区中。
      //创建 s1 局部变量
      //在堆中创建一个Student对象,并将这个对象的地址赋值给 s1
      Student s1 = new Student();
      //通过 s1 这个引用先找到Student对象,然后找到 name 属性
      //创建"老叶"这个字符串常量,并将它放在常量池中
      // 将 s1 的 name 属性 赋值为这个字符串的引用
      s1.name = "老叶";
      //通过 s1 这个引用先找到Student对象,然后找到 study() 方法的引用,然后去方法区内找到方法,执行该方法,开一个栈帧,执行完成后释放这个栈帧。
      s1.study();
      s1.sayHello("老王");

      //这个和上面同理
      Student s2 = new Student();
      s2.age = 18;
      s2.name="老李";
  }

}

注:基本数据类型会直接赋值,引用类型是把对象的地址赋值

这是对上面 Test1 类执行代码的内存分析图!!!

image

原文发布时间为:2018-07-22
本文作者:帅飞
本文来自云栖社区合作伙伴“ Java知音”,了解相关信息可以关注“ Java知音”

相关文章
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1360 3
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
393 2
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
458 98
|
12月前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
514 4
|
存储 缓存 Java
【深入浅出】揭秘Java内存模型(JMM):并发编程的基石
本文深入解析Java内存模型(JMM),揭示synchronized与volatile的底层原理,剖析主内存与工作内存、可见性、有序性等核心概念,助你理解并发编程三大难题及Happens-Before、内存屏障等解决方案,掌握多线程编程基石。
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
463 2
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
330 1
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
437 1
|
缓存 监控 Kubernetes
Java虚拟机内存溢出(Java Heap Space)问题处理方案
综上所述, 解决Java Heap Space溢出需从多角度综合施策; 包括但不限于配置调整、代码审查与优化以及系统设计层面改进; 同样也不能忽视运行期监控与预警设置之重要性; 及早发现潜在风险点并采取相应补救手段至关重要.
1148 17