您的位置:首页 > 编程语言 > Java开发

学习笔记-java内存分析

2013-06-06 20:45 429 查看
1.经典的jvm内存结构图(深入java虚拟机 2ed)



        方法区 包含:该类的类型信息,该类型的常量池,方法字节码,静态变量

2.需要分析

      1). 字面值

      2).常量(类常量)

      3).静态变量

      4).字符串

       5).数组

       6).继承

        7).多态

3.字面值

       Java中的字面值常称为常量,可以是任何简单数据类型。java文件编译成class后,字面值存在方法中(指令集合中),嵌入到字节码中

public static void main(String[] args) {
int ad=12;
final int sd=24;
int add=123;
}



其中12,24,在class载入内存后,指令(方法)放在方法区中,当执行引擎执行 相应指令时,值放入 java栈中运算。

注意:java栈有个特点,共享数据。 ad=12,入栈过程。首先,在该线程的java栈中查找 12这个值,如果找到(前语句定义的),ad就是前面12的地址。如果没找到,在java栈上开辟新空间存入 12.(这个特点与栈的先进后出有关,我认为)。

4.常量

   不可改变值。final修饰。





sd 字面值 常量,属于方法,保存如字面值一样。 fg是类的数据成员,保存在 常量池中。每个类都有一个常量池。
5.静态变量





   类的静态变量,类载入jvm时,调用clinit()方法,把静态变量放入方法区中的静态区。 静态代码块也放在静态区。

6.字符串

   字符串是编译时常量,放在常量池中。

   String str=new String("abc");为什么创建两个对象。

   每个字符串常量是String的实例,即一个对象。





在编译时,“abc”保存进class常量池,加载入jvm的方法区的常量池中。在运行时,new在堆中开辟空间,把常量池中“abc”转成字符数组,存入String的对象str的数据空间。所以创建两个对象,一个在常量池中,一个在堆中。

string 源代码:

private final char value[];

//把original转成字符数组 赋给 value.

public String(String original) {

    int size = original.count;

    char[] originalValue = original.value;

    char[] v;

      if (originalValue.length > size) {

            int off = original.offset;

            v = Arrays.copyOfRange(originalValue, off, off+size);

     } else {

        v = originalValue; 

     }

    this.offset = 0;

    this.count = size;

    this.value = v;

    }public String(String original) {

}

7.数组

   栈中引用指向堆中数组对象。

 8. 继承

       


        子类中有父类的实例。

        this指向本对象的地址。作用: 隐式参数,避免名字冲突,构造方法重载。

        super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见。它不指向任何对象。

  9. 多态

         编译时,根据定义类型方法表检索。

         运行时,根据实际对象的类型(this)。

总结:编译时变量,字面量嵌入字节码中,在栈中共享(方法中)。

           String存的字符数组是final,是常量,放在常量池中,在常量池中共享(类中)。

           static放在方法区中的静态区共享(类中)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: