案例:

输出结果

内存图:

执行流程:

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. windows下,cmd 运行 python 脚本,选中文字就停止运行了【已解决】

    参考资料: https://jingyan.baidu.com/article/ce09321bb95dda2bff858f26.html 问题原因: cmd 里面,快速编辑模式会暂停程序 解决步骤: ...

  2. IOS应用程序开发流程

    应用程序开发流程 1.IOS开发需要思考的问题 用户是谁?不同应用程序的内容和用户体验大不相同,这取决于想要编写的是什么应用程序,它可能是儿童游戏,也可能是待办事项列表应用程序,又或者是测试自己学习成 ...

  3. 使用 Pinup,PinupManager 在 XNA 中创建贴图(十七)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  4. manjaro安装anaconda出错

    出错信息: ==> Creating package "anaconda"...  -> Generating .PKGINFO file...  -> Gene ...

  5. 习题:玛丽卡(SPFA)

    玛丽卡(wikioi1021) [题目描述 ]麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多只有一条路相通, ...

  6. linux系统——软链接、硬链接

    区别:硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件: 在文件属性上软链接明确写出了是链接文 ...

  7. Cmake——CMake+SVN或Hg生成版本号

    CMake+SVN或Hg生成版本号 原来的CMake需要用shell脚本生成SVN版本号,再作为cmake参数传入.CMake调用脚本示例: #!/bin/sh # cmake.sh ServerCo ...

  8. JAVA 字节流和字符流度读写的区别

    java处理文件的类里面,stream结尾都是采用字节流,reader和writer结尾都是采用字符流.两者的区别就是读写的时候一个是按字节读写,一个是按字符. 字符流的底层就是字节流.而字符流主要是 ...

  9. String 类详解

    StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上StringBuilder类 ...

  10. 关于 react state的改变数据上面的一点问题

    在react当中 比如说 this.state = { loginInfo: { account: "...", password: "..." } } thi ...