Java---Static内存图详解
案例:

输出结果

内存图:

执行流程:
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内存图详解的更多相关文章
- Java的内存机制详解
Java把内存分为两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间, ...
- Java虚拟机内存分配详解
简介 了解Java虚拟机内存分布的好处 1.了解Java内存管理的细节,有助于程序员编写出性能更好的程序.比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈 (stack),其栈是先进后出的数 ...
- Java虚拟机内存区域详解
JVM 运行时的数据区域 首先获取一个直观的认识: 总共也就这么 5 个区(直接内存不属于 JVM 运行时数据区的一部分),除了程序计数器其他的地方都有可能出现 OOM (OutOfMemoryErr ...
- java基础内存基础详解
堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...
- Java static{}语句块详解
[转自] http://blog.csdn.net/lubiaopan/article/details/4802430 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一 ...
- java 堆栈内存分析详解
计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- Java内存结构详解
Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...
- 云时代架构阅读笔记六——Java内存模型详解(二)
承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...
随机推荐
- 1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085[Submit][Sta ...
- springboot学习资料汇总
收集Spring Boot相关的学习资料,Spring Cloud点这里 推荐博客 纯洁的微笑 程序猿DD liaokailin的专栏 Spring Boot 揭秘与实战 系列 catoop的专栏 简 ...
- WinRM和WinRS
1.6.2 新远程工具:WinRM和WinRS 2012-05-14 10:18 张杰良 译 清华大学出版社 字号:T | T 综合评级: 想读(18) 在读(5) 已读(0) 品书斋鉴(0) ...
- 通过APP,网页打开手机客户端QQ
以下内容为转载,原帖子 http://m.blog.csdn.net/blog/qduningning/40587099 在浏览器中可以通过JS代码打开QQ并弹出聊天界面,一般作为客服QQ使用.而在移 ...
- 【Best Time to Buy and Sell Stock II】cpp
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- ASP.NET Core 利用中间件支持跨域请求
方法1: 在Startup的ConfigureServices()中添加services.AddCors()在Startup的Configure()中添加app.UseCors(); 保证其在app. ...
- 解决pymysql不能实时查询最新的数据
#在网上查询到的原因为: InnoDB 的默认隔离级别.它可以防止任何被查询的行被其他事务更改,从而阻止不可重复的读取,而不是 幻读取.它使用中度严格的锁定策略,以便事务内的所有查询都会查看同一快照中 ...
- Python基础-week02 Python的常用数据类型
一.模块初识 import导入Py自带模块例如os,sys等及其自己编写的Py文件,导入到其他文件中,默认查找当前目录.如果不在同一目录,会报错,将该自定义py文件模块放到site-packages目 ...
- Emma中文乱码解决方法
vim -/.emma/emmarc db_encoding=latin1 改为 db_encoding=utf8 sudo vim /usr/share/emma/emmalib/mysql_hos ...
- Mysql实战之主从复制的读写分离
author:JevonWei 版权声明:原创作品 ProxySQL构建主从复制的读写分离 ProxySQL官网及下载地址 http://www.proxysql.com/ 架构角色 mysql-sl ...