通常情况下,Java把内存分为栈内存、堆内存和方法区

栈内存用来存放一些基本类型的变量和数组(数组也是一种引用类型)及对象的引用变量

堆内存主要是来放置对象的,即我们在程序中new出来的对象。

static,意味为静态的,用static修饰的变量和方法,实际上是给这些变量和方法指定了在内存中的”位置“(这个位置也叫静态区、方法区、数据区和共享区)。既然在内存中指定了位置,那么他们的 “大小”似乎就是固定的了,有了位置和大小的特征,在栈中或堆中开辟空间那就是非常的方便了。对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态变量的空间(内存空间),即编译时就为这些成员变量的实例分配了空间。

下面我们来看一段代码

 package demo;

 public class StaticDemo {
public static void main(String[] args) {
Visitor visitor1 = new Visitor();
System.out.println("count : " + visitor1.count);//
System.out.println("visitCount : " + Visitor.visitCount);// Visitor visitor2 = new Visitor();
System.out.println("count : " + visitor2.count);//
System.out.println("visitCount : " + Visitor.visitCount);// Visitor visitor3 = new Visitor();
visitor3.count = 5;
visitor3.visitCount = 0; // 归0
System.out.println("count : " + visitor1.count);//
System.out.println("count : " + visitor2.count);//
System.out.println("count : " + visitor3.count);//
System.out.println("visitCount : " + visitor1.visitCount);//
System.out.println("visitCount : " + visitor2.visitCount);//
System.out.println("visitCount : " + visitor3.visitCount);//
}
} class Visitor {
int count;
static int visitCount; public Visitor() {
count++;
visitCount++;
}
}

从上面代码来看,用static修饰的变量,每个类的实例改变的都是同一个副本,即在内存中static修饰的变量只有一份,而对于普通的成员变量,每个实例都有各自的副本,我们用图来简单的分析StaticDemo类的代码,首先JVM把Visit类与StaticDemo类编译完然后加载到方法区,在Visit方法区中,JVM检查到有个static修饰的变量visitCount,则又开辟了一块内存(叫做静态区)来存放,此时内存情况

接着JVM会自动寻找main方法并在栈中为其开辟一个空间,再看代码第5行

这时,来了一个访问者visitor1,JVM在栈中为visitor1开辟了一块内存,并且指向堆中的Visitor内存空间,由于count与visitCount为成员变量,所以有默认初始值0,根据代码

第6行与第7行的运行结果

我们可以得到count与visitCount变量在堆内存中的值

同理9,10,11行

与5,6,7行分析类似,此时内存情况及count与visitCount变量的值

接下来来了一个visitor3,把count与visitCount都重新赋值了

由于visitor1,visitor2,visitor3在堆空间中都有各自的count变量,所有当visitor3改变了count变量的值时,visitor1与visitor2的count变量值并没有受影响,而当visitor3对visitCount重新赋值了,因为visitor1,visitor2,visitor3的visitCount都为静态区中的0x0001,所以用visitor1,visitor2,visitor3访问的visitCount为最新的值0。可见,静态变量与具体的实例无关,属于整个类,在编程中,当所有对象共享某个数据的时候,我们就可以把这个成员变量定义为静态的,如上面的visitCount。

static关键字的内存分析的更多相关文章

  1. Java中this、static关键字的内存图解

    Java中的关键字有很多,abstract  default  goto*  null  switch  boolean  do  if  package  nchronzed  break  dou ...

  2. 面向对象编程(十)——继承之Super关键字及内存分析

    Super关键字

  3. Java基础之static关键字的用法

    Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.        静态(static)可以是: 变量 ...

  4. 你真的了解JAVA中对象和类、this、super和static关键字吗

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 Java对象究竟是什么? 创建对象的过程 ...

  5. Java基础(二)-static关键字分析

    static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...

  6. static 关键字分析

    在java中static 关键字用途很广,可以修饰成员变量 方法 甚至类(静态内部类),这里不分析static 修饰类 static修饰的内容的运行顺序 java的程序执行之前有一个类的加载的过程,在 ...

  7. 「C」关键字、标识符、注释、内存分析、数据、常量、变量

    一.关键字 C语言提供的有特殊含义的符号,共32个. 一般在Xcode中关键字全部显示紫褐色,关键字全部都为小写.如int.return等. 二.标识符 标识符是程序员在程序中自定义的一些符号和名称. ...

  8. java执行程序的内存分析系列专栏二之static变量和方法内存分析

    昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...

  9. java 内存分析之static

    源码: 内存分析: 源码: 静态方法:   用static 声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static 方法中不可访问非static 的成员.   可以通过对象 ...

随机推荐

  1. disruptor调优方法

    翻译自disruptor在github上的文档,https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started Basic Tuning ...

  2. jsp文件和HTML互相引入的乱码问题

    1.在jsp中用include指令引入HTML文件时遇到的问题: jsp.html都可以正确的显示,当jsp引入html时访问jsp页面HTML出现乱码,jsp原有的输出无乱码,解决方法: 在HTML ...

  3. window本地运行mapreduce程序

    mapreduce的运行方式一般有两种,一是从本地导出一个jar包,在传到虚拟机上运行,这样调试起来非常的不方便,如果出现错误就需要重新导出jar包. 第二种方式是在本地直接运行,但是在运行前需要进行 ...

  4. VSTO学习(二)——Excel对象模型

    要开发Excel的项目,就自然少不了对Excel对象模型的了解了,只有了解Excel对象模型,这样才能更好地对Excel进行处理.下面先给出一张Excel对象模型的图: 下面就具体对上图中的各个对象做 ...

  5. (转)Jupyter notebook入门教程(上,下)

    https://blog.csdn.net/red_stone1/article/details/72858962------上 https://blog.csdn.net/red_stone1/ar ...

  6. (转)mysql自增列导致主键重复问题分析

    mysql自增列导致主键重复问题分析...  原文:http://www.cnblogs.com/cchust/p/3914935.html 前几天开发童鞋反馈一个利用load data infile ...

  7. Vue路由router-link的使用

    Vue路由router-link的使用 相关Html: <!DOCTYPE html> <html lang="en"> <head> < ...

  8. ASP.NET 负载均衡 StateServer Session共享问题(经验记录)

    (源地址:http://www.cnblogs.com/ryhan/p/3748976.html) 最近在改造公司的一个系统 支持F5硬件负载,由于系统后面还跟了个异步工具,需要将Admin上传的文件 ...

  9. 《垃圾回收的算法与实现》——GC标记-清除算法

    基本算法 标记-清除算法由 ==标记阶段== 和 ==清除阶段== 构成. 标记即将所有活动的对象打上标记. 清除即将那些没有标记的对象进行回收. 标记与清除 遍历GC root引用,递归标记(设置对 ...

  10. mysql Inoodb 内核

    MySQL从5.5版本开始将InnoDB作为默认存储引擎,该存储引擎是第一个完整支持事务ACID特性的存储引擎,且支持数据行锁,多版本并发控制(MVCC),外键,以及一致性非锁定读. 作为默认存储引擎 ...