zoukankan      html  css  js  c++  java
  • 第七篇 JAVA内存分析

    一、概念

    栈:存放局部变量,有顺序的,先进后出,用完会自动回收。

    堆:存放new出来的对象,没顺序,需要垃圾回收机制回收。

    方法区:存放类信息,static变量,常量池(我们主要研究字符串常量池)。方法区在堆里面。

    研究代码的运行过程,我们只需要知道这几个概念就好了。

    二、简单程序内存图

    分析的代码:

    public class Student {
         String name;
         int age;
    
        public void study(){
            System.out.printf(name+ "正在学习!");
        }
    
        public static void main(String[] args) {
            Student s = new Student(); //1
    
            s.name = "小明"; // 2
            s.study();  //3
    
        }
    }

    Java的所有程序都是从main方法开始执行,

    1. 执行第一句话,查找方法区中是否有Student这个类,如果没有则加载进来。在栈中生成一个局部变量s,此时的s是没有赋值。以Student类为模板创建一个Student对象,该对象保存在堆中,并将对象的首地址赋给s,这样s就指向了创建的对象。这些指向本质是内存地址的值。

    image

    这里注意的是,成员变量在对象初始化的时候就有默认值,基本类型的默认值如下表所示,引用变量的默认值都为null。

    类型 默认值
    byte 0
    short 0
    int 0
    long 0L
    float 0.0f
    double 0.0
    boolean false
    char /u0000(空值)
    引用类型 null

    所以在一开始的时候name的值为null,age的值为0。

    2. 执行第二句话,将s指向的对象的name属性变成小明。这样name的值就由null变成了小明,但”小明”是字符串,存放在常量池中,所以name指向常量池中的小明。

    image

    3. 执行第三句话,调用对象的方法,对象都是以类为模板创建出来的,所以它们的方法执行的代码都是一样的,只是参数不一样而已。所以执行的都是方法区中的代码。

  • 相关阅读:
    Qt(python) + 百度语音合成 实现demo
    windows7 + Qt(MSVC2017) + VS2019安装配置
    ubuntu下openCV-Haar特征分类器训练
    坚果云+typora(个人十分喜欢的一个记笔记方式)
    文本编辑--程序员专属技能
    ftp、tftp、nfs--服务器搭建
    QT--动态人流量监测系统
    C++ --内存四区概述
    CTFHUB-技能树-Web-信息泄露
    网络教育行业频发奖金高薪挖人,在线教育行业将迎来快速发展
  • 原文地址:https://www.cnblogs.com/duoluomengxing/p/6575940.html
Copyright © 2011-2022 走看看