您现在的位置是:首页 > 文章详情

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

日期:2018-07-22点击:474

内存分析先知

栈:

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

原文链接:https://yq.aliyun.com/articles/617784
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章