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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java执行程序的内存分析系列专栏二之static变量和方法内存分析相关的知识,希望对你有一定的参考价值。

        昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析。

  1.static变量和方法的第一个特性内存分析

      
      statiic变量和方法的第一个特性能通过类名.static变量和类名.static方法的形式调用,而普通只能对象的形式调用。但具体为什么是这样的,这得分析static变量和方法他们在内存中怎样分配的,因此在这里我首先建立一个学生类,里面有一个普通成员变量和一个静态成员变量以及一个普通方法和一个成员方法,然后建立了一个测试学生的类。

 1   public class Student {
 2      String name;//普通成员变量
 3      static String ss;//静态成员变量
 4     static void ss(){
 5         System.out.println("我是一个静态方法,能被类名直接调用");
 6     }
 7      void speak(){
 8         System.out.println("我是普通方法,只能通过对象调用");
 9     }
10 }
11 public class StudentTest {
12 
13     public static void main(String[] args) {
14         // TODO Auto-generated method stub
15         Student.ss="sdf";
16         Student.ss();
17         //Student.name普通成员变量不能通过类名直接访问
18         //Student.speak()普通成员方法不能通过类名调用
19         Student s = new Student();
20         s.ss="sdf";
21         s.ss();
22         s.speak();
23         s.name="lisong";
24         
25     }
26 
27 }

 在这里首先加载StudentTest类到方法区,然后在堆栈为变量分配空间,具体的执行过程中内存分配已经在上一篇http://www.cnblogs.com/songadai/p/7098649.html已经分析了,所以这里就不详解了,下面就直接附上内存图。应该对static有个清晰认识了。

技术分享

仔细观察上图,这里我就简要说明下,为什么static变量和方法能够通过类名直接访问,而普通成员变量却不能直接访问,静态区是一块特殊的区域,特殊在能访问能通过类名直接找静态变量和方法这块区域,而代码区和常量区却不能直接访问。

2.static变量和方法的第二个特性内存分析

static变量和方法的第二个特性是静态方法不能直接调用普通成员变量方法和普通成员变量,但普通变量却能直接调用静态方法和变量以及对象也能调用静态成员和方法。其实当对象访问变量时的过程时这样的,当对象一个访问一个变量时,首先先在对象自己所在的堆空间寻找,如果没有找到,则去静态区寻找变量,如果没有找到,就报错。

技术分享

 这里有点注意的是,根据类创建对象的时候,静态变量不会创建,它只属于类。

       3.结语

    内存分析系列第二篇就差不多结束了,下一篇我们将讨论下关于this,super的一些内部机制。


以上是关于java执行程序的内存分析系列专栏二之static变量和方法内存分析的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机二之Java内存区域与内存溢出异常

性能测试分析之JVM系列

static关键字之内存分析

Java并发组件二之CyclicBarriar

Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息

JVM 内存模型概述