Javap查看Class指令

javac Hello.java

[java]   view plain  copy
  1. public class Hello{  
  2.    static int num = 1;  
  3.    void hello(){  
  4.         String s = "aa";  
  5.         System.out.println(s);  
  6.         String s2 = new String("aa");  
  7.         System.out.println(s2);  
  8.    }  
  9. }  

 


javap -v Hello.class

[java]   view plain  copy
  1. Classfile /G:/workspace/Projects/Golang/Hello.class  
  2.   Last modified 2014-12-30; size 527 bytes  
  3.   MD5 checksum e84276bb63ef1ea05d80fa07852dfce2  
  4.   Compiled from "Hello.java"  
  5. public class Hello  
  6.   SourceFile: "Hello.java"  
  7.   minor version: 0  
  8.   major version: 51  
  9.   flags: ACC_PUBLIC, ACC_SUPER  
  10. Constant pool:  
  11.    #1 = Methodref          #9.#20         //  java/lang/Object."<init>":()V  
  12.    #2 = String             #21            //  aa  
  13.    #3 = Fieldref           #22.#23        //  java/lang/System.out:Ljava/io/PrintStream;  
  14.    #4 = Methodref          #24.#25        //  java/io/PrintStream.println:(Ljava/lang/String;)V  
  15.    #5 = Class              #26            //  java/lang/String  
  16.    #6 = Methodref          #5.#27         //  java/lang/String."<init>":(Ljava/lang/String;)V  
  17.    #7 = Fieldref           #8.#28         //  Hello.num:I  
  18.    #8 = Class              #29            //  Hello  
  19.    #9 = Class              #30            //  java/lang/Object  
  20.   #10 = Utf8               num  
  21.   #11 = Utf8               I  
  22.   #12 = Utf8               <init>  
  23.   #13 = Utf8               ()V  
  24.   #14 = Utf8               Code  
  25.   #15 = Utf8               LineNumberTable  
  26.   #16 = Utf8               hello  
  27.   #17 = Utf8               <clinit>  
  28.   #18 = Utf8               SourceFile  
  29.   #19 = Utf8               Hello.java  
  30.   #20 = NameAndType        #12:#13        //  "<init>":()V  
  31.   #21 = Utf8               aa  
  32.   #22 = Class              #31            //  java/lang/System  
  33.   #23 = NameAndType        #32:#33        //  out:Ljava/io/PrintStream;  
  34.   #24 = Class              #34            //  java/io/PrintStream  
  35.   #25 = NameAndType        #35:#36        //  println:(Ljava/lang/String;)V  
  36.   #26 = Utf8               java/lang/String  
  37.   #27 = NameAndType        #12:#36        //  "<init>":(Ljava/lang/String;)V  
  38.   #28 = NameAndType        #10:#11        //  num:I  
  39.   #29 = Utf8               Hello  
  40.   #30 = Utf8               java/lang/Object  
  41.   #31 = Utf8               java/lang/System  
  42.   #32 = Utf8               out  
  43.   #33 = Utf8               Ljava/io/PrintStream;  
  44.   #34 = Utf8               java/io/PrintStream  
  45.   #35 = Utf8               println  
  46.   #36 = Utf8               (Ljava/lang/String;)V  
  47. {  
  48.   static int num;  
  49.     flags: ACC_STATIC  
  50.   
  51.   public Hello();  
  52.     flags: ACC_PUBLIC  
  53.     Code:  
  54.       stack=1, locals=1, args_size=1  
  55.          0: aload_0  
  56.          1: invokespecial #1                  // Method java/lang/Object."<init>":()V  
  57.          4return  
  58.       LineNumberTable:  
  59.         line 10  
  60.   
  61.   void hello();  
  62.     flags:  
  63.     Code:  
  64.       stack=3, locals=3, args_size=1  
  65.          0: ldc           #2                  // String aa  
  66.          2: astore_1  
  67.          3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;  
  68.          6: aload_1  
  69.          7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  70.         10new           #5                  // class java/lang/String  
  71.         13: dup  
  72.         14: ldc           #2                  // String aa  
  73.         16: invokespecial #6                  // Method java/lang/String."<init>":(Ljava/lang/String;)V  
  74.         19: astore_2  
  75.         20: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;  
  76.         23: aload_2  
  77.         24: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  78.         27return  
  79.       LineNumberTable:  
  80.         line 40  
  81.         line 53  
  82.         line 610  
  83.         line 720  
  84.         line 827  
  85.   
  86.   static {};  
  87.     flags: ACC_STATIC  
  88.     Code:  
  89.       stack=1, locals=0, args_size=0  
  90.          0: iconst_1  
  91.          1: putstatic     #7                  // Field num:I  
  92.          4return  
  93.       LineNumberTable:  
  94.         line 20  
  95. }  


 

static {};静态初始化代码;

String s = "aa";new String("aa");从同一常量池出获取值

 

Java的8中基本类型:boolen,char,byte,short,int,long,float,double,基本类型的值被存储在栈中,因为这样更快。

栈:
1、当定义 int a = 10 时,编译器会在栈中分配4个字节空间来存放值(10),内存地址(0x0001)。
2、创建变量a, a的内存地址(0x0005),存放(10)的地址(0x0001)。引用(10)。
3、再定义 int b = 10 时,b的内存地址(0x0006), 同样存放(10)的地址(0x0001)。引用(10)。
所以栈中的数据是共享的。

 

堆:
内存池,存储所有使用new出来的Java对象。
创建一个对象通常包括两个步骤:
1、对象声明(即创建对象引用)。
2、实例化(即为对象在堆中分配存储空间)。

 

常量
  

 


 

堆,方法区,栈和本地方法栈

堆(-Xms和-Xmx)调节

new出来的对象实例,都在堆上分配内存。

 

方法区(-XX:PermSize和-XX:MaxPermSize)调节

存放:类、静态变量和常量。
静态变量、常量、类太多,永久带内存可能不够。

 

栈和本地方法栈(-Xss)调节

存放:局部变量、参数、操作,方法出口等与方法相关的信息。
方法调用层次太多(递归), 该区内存可能不够。

 

===============================================================
(heap, stack, data-seg, code-seg)
heap:-->new出来对象。
stack:--局部变量,用来计算的。
data-seg:-->静态变量、字符串常量
code-seg:-->代码

 

 ===============================================================



public void print(){
    Object o = new Object();
}




这里这里程序会创建两个对象内存空间:
1、new Object()存在堆中。
2、o引用,存在栈中。


堆中的内存是由GC来管理回收的。(程序中没有对该对象存在引用)
栈中的内存是当方法的栈帧运行完后就释放的(引用占4个字节)。


程序运行时涉及:(指令栈,本地变量区、操作数区)


public void print(){
    Integer l;
    for (int i=1; i < 3; i++) {
        l = 2;
    }
}

public void print(){
    for (int i=1; i < 3; i++) {
        Integer l = 2;
    }
}

后者Integer l 在同一goto指令内,栈对象都是复用的,刻意写成前者,对内存优化并没有任何实在意义。



用来o后设置 为o=null。
在同一方法栈内,o为局部变量,且为引用类型,对内存优化并没有任何实在意义。





 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值