• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

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

技术杂谈 勤劳的小蚂蚁 3个月前 (01-26) 69次浏览 已收录 0个评论 扫描二维码

内存分析先知

栈:

1、每个线程私有,不能实现线程间的共享!
2、局部变量放置于栈中。
3、栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆:

1、放置new出来的对象!
2、堆是一个不连续的内存空间,分配灵活,速度慢!

方法区:

1、被所有线程共享!
2、用来存放程序中永远不变或唯一的内容。(类代码信息、静态变量、字符串常量)
注:常量池具有共享的机制,不同类的常量池之间共享数据。比如:Student 类常量池下有个 “老叶”字符串常量,那么当 Test 类中用到”老叶”这个字符串常量时就会去方法区的其他类的常量池中找,刚好 Student 类有,所以它直接就引用Student 类的”老叶”
开始分析
Student 类
publicclassStudent {
  //静态的数据
  String name;
  int id;    //学号
  int age;
  String gender;
  int weight;

  //动态的行为
  publicvoidstudy(){
      System.out.println(name+“在学习”);
  }
  publicvoidsayHello(String sname){
      System.out.println(name+“向”+sname+“说:你好!”);
  }

}

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

  publicstaticvoidmain(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 类执行代码的内存分析图!!!


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Java 程序执行过程的内存分析
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00