案例:

输出结果

内存图:

执行流程:

java文件通过编译成class文件,class文件通过类加载器加载到方法区中,程序首先会加载核心类库,也就是你的程序想要运行所需要的一些最基本的类。接着程序会找代码主方法所在的类,将StaticDemo1.class这个类加载到方法区中,这个类中没有属性,但有一个静态方法main,此时将StaticDemo1.class这个类所在内存分成两部分,一部分是非静态区域,一部分是静态区域,main方法加载到静态区域,但并未执行,这一步仅仅是将mian方法存储到方法区,mian方法是由JVM调用的,JVM调用main方法,mian方法开始在栈中执行,在栈中开辟一块空间。然后接着按照代码顺序往下执行, 接着执行Person p1 = new Person();准备创建Person对象,要创建对象必须先找到对应Person类,此时发现内存中并没有Person类,然后就开始加载Person类(Person类是在第一次使用的时候才会加载,比如有300个类,不是全部一起加载的,是当你需要用到哪个类才会加载对应的类),加载Person类时发现有对应的属性和方法,Person类将空间分成静态和非静态两部分,将name,age,toStr()加载到非静态区域,将kongfu加载到静态区域,由于kongfu是一个静态属性,Java在编译和运行时候会给这个属性一个默认值,String类型默认值为null,这个过程叫做kongfu属性初始化,此时kongfu属性在方法区中有了具体的大小,也就意味着kongfu属性在方法区占用了一块内存 ,就会产生对应的内存地址0xacal,加载完Person类后发现并没有对象,也就意味着静态变量先于对象而存在,静态变量是随着类的加载而加载到方法区中的,在方法区被赋予默认值,静态变量可以不依附于对象,没有对象也能使用静态变量,可以用过类名来调用,所以静态变量也称类变量。加载完Person类,开始创建p1对象,首先在栈中mian方法区开辟一块空间p1,在堆内存中开辟一块空间,地址为0xbcd3,将地址赋值给p1,p1顺着地址可以找到这块空间,而空间里有对应的属性,分别赋上默认值,在给kongfu赋默认值时,发现kongfu是一个静态属性,然后程序会去方法区的对应类中寻找是否有对应的静态属性,找到之后会把方法区中对应静态属性的地址0xacal拿过来,然后堆内存中的kongfu属性通过地址找到方法区中kongfu属性。接着下行代码,开始给属性复制,name赋值为梅超风,age赋值为50,给kongfu赋值时,kongfu会根据地址一直找到方法区中的kongfu,将默认值null覆盖,然后赋值为九阴白骨爪。接着执行代码Person p2 = new Person();同理,先找到对应的Person类,此时发现Person类已经在方法区中加载了,此时就不会再重复加载了,因为类只加载一次,既然Person类已经加载了,就直接创建p2对象,同理,分别在堆内存和栈中开辟空间,地址赋值,属性赋值,kongfu根据地址找到方法区中的kongfu,经原来的九阴白骨爪覆盖,重新赋值为蛤蟆功。所以会打印出两个蛤蟆功。

Java---Static内存图详解的更多相关文章

  1. Java的内存机制详解

    Java把内存分为两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间, ...

  2. Java虚拟机内存分配详解

    简介 了解Java虚拟机内存分布的好处 1.了解Java内存管理的细节,有助于程序员编写出性能更好的程序.比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈 (stack),其栈是先进后出的数 ...

  3. Java虚拟机内存区域详解

    JVM 运行时的数据区域 首先获取一个直观的认识: 总共也就这么 5 个区(直接内存不属于 JVM 运行时数据区的一部分),除了程序计数器其他的地方都有可能出现 OOM (OutOfMemoryErr ...

  4. java基础内存基础详解

    堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...

  5. Java static{}语句块详解

    [转自] http://blog.csdn.net/lubiaopan/article/details/4802430 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一 ...

  6. java 堆栈内存分析详解

    计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...

  7. java程序运行时内存分配详解

    java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下   一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...

  8. Java内存结构详解

    Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...

  9. 云时代架构阅读笔记六——Java内存模型详解(二)

    承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...

随机推荐

  1. MapReduce实现单词统计

     开发工具:IDEA mapreduce实现思路: Map阶段: a) 从HDFS的源数据文件中逐行读取数据 b) 将每一行数据切分出单词 c) 为每一个单词构造一个键值对(单词,1) d) 将键值对 ...

  2. IOS开发---菜鸟学习之路--(六)-UITableView几个方法的使用说明

    对于UITableView的基础使用我这边就不做重复介绍了 我重点就来介绍下如何实现大部分新闻的界面.也就是第一条记录显示大图片下面加一段文字说明 然后剩下来的内容全部显示为文字图片的格式 其实要做到 ...

  3. IOS开发学习笔记030-xib实现淘宝界面

    使用xib文件实现界面,然后通过模型更新数据. 1.使得控制器继承自UITableViewController 2.创建xib文件,实现界面如下:一个UIImageView,两个lable 3.新建一 ...

  4. dijkstra 堆优化

    #include <iostream> #include <vector> #include <cstring> #include <queue> us ...

  5. 设计模式 uml元素

    uml的构造包含3种 事物4种:结构,行为,分组,注释事物 关系4种:泛化,实现,依赖,关联, 图10种,用例图,类图,对象,包,组件,部署,状态,活动,序列,协作 事物是对模型中最具代表性的成分的抽 ...

  6. selenium webdriver——鼠标事件

    Web产品中提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在WebDriver中,将这些关于鼠标操作的方法 封装在ActionChains类中: ActionChains类 ...

  7. sun.misc.BASE64Encoder()编码有换行符需要手动去除passwordEncode.replace("\n","");

    String passwordEncode = new BASE64Encoder().encodeBuffer(password.getBytes());//sun.misc.BASE64Encod ...

  8. linux系统mysql密码修改脚本

    编写了一个适用于阿里云linux系统 mysql密码修改脚本,使用阿里云提供的一键安装包配置后,如果account.log文件删除,并且忘记mysql密码时,可以通过脚本来重置mysql密码. 附:一 ...

  9. Redhat/CentOS安装vsftp软件

    1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.zJ3dBU&helpId=1692 2.安 ...

  10. 34条简单的SQL优化准则

    转载地址:http://bbs.csdn.net/topics/260002113 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享!(1)    ...