博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 程序执行过程的内存分析
阅读量:6624 次
发布时间:2019-06-25

本文共 1312 字,大约阅读时间需要 4 分钟。

内存分析先知

栈:

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

本文作者:帅飞
本文来自云栖社区合作伙伴“ ”,了解相关信息可以关注“ ”

转载地址:http://uhtpo.baihongyu.com/

你可能感兴趣的文章
python基础及函数1
查看>>
iptables使用 配置
查看>>
python文件操作
查看>>
find&locate
查看>>
接口规范 9. 推流认证相关接口
查看>>
python连接redis
查看>>
中国大数据科技传播联盟在京成立
查看>>
LAMP架构(LAMP介绍,mysql/mariaDB介绍,Mysql安装)
查看>>
栈排序,只能使用额外的一个栈空间 && 有道一面
查看>>
jQuery垂直菜单和水平菜单实现
查看>>
xargs 命令
查看>>
Linux文件系统之挂载U盘
查看>>
awk——报告生成器
查看>>
oracle 体系结构
查看>>
Nginx+Keepalived搭建高可用负载均衡集群
查看>>
聚合链路及故障排查
查看>>
zabbix监控mysql以及报警(二)终
查看>>
后台服务程序开发模式
查看>>
VS2015 正式版中为什么没有了函数前面引用提示了?
查看>>
windows 系统的安装和虚拟机共享文件夹
查看>>