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知音

相关文章
|
14天前
|
存储 Java 编译器
Java内存区域详解
Java内存区域详解
29 0
Java内存区域详解
|
24天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
16天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
16 0
|
16天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
13 0
|
18天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 0
|
15天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
35 3
|
21天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
28天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
79 0
|
2天前
|
Java
网页运行java程序cheerpj
网页运行java程序cheerpj
27 0
|
2天前
|
Java 程序员 数据库连接
Java从入门到精通:3.3.2性能优化与调优——内存管理篇
Java从入门到精通:3.3.2性能优化与调优——内存管理篇
Java从入门到精通:3.3.2性能优化与调优——内存管理篇