从虚拟机视角谈 Java 应用性能优化
2010-07-15 00:00:00 来源:WEB开发网清单 1. Java 字节码例
/* 0x000092c4:0x04a7: */ _SCONST_0,
/* 0x000092c5:0x04a8: */ _SCONST_0,
/* 0x000092c6:0x04a9: */ _INVOKESTATIC, HIGH(0x08e8), LOW(0x08e8),
/* 0x000092c9:0x04ac: */ _POP,
/* 0x000092ca:0x04ad: */ _INVOKESTATIC, HIGH(0x8046), LOW(0x8046),
/* 0x000092cd:0x04b0: */ _IFEQ, 84,
/* 0x000092cf:0x04b2: */ _INVOKESTATIC, HIGH(0x8044), LOW(0x8044),
/* 0x000092d2:0x04b5: */ _GOTO, 79,
/* 0x000092d4:0x04b7: */ _ASTORE, 7,
当程序计数器中值为 0x000092ca:0x04ad,表明下一条即将执行字节码为 _INVOKESTATIC, HIGH(0x8046), LOW(0x8046),该字节码表明将调用某个静态方法。
Java 语言一大好处就是不用关心对于内存的分配和回收,一切由垃圾收集器搞定。然而这并不代表 Java 程序员可以高枕无忧,再高效的收集器也可能因为滥用而导致性能问题。我们已经知道,Java 程序所涉及的空间分配和回收包括:
Java 堆,创建的 Java 对象(包括数组,数组也是一种对象)分配在堆中,垃圾收集对象来释放空间;
Java 栈,栈划分为操作数栈、栈帧数据和局部变量区,方法中分配的局部变量在栈中,同时每一次方法的调用都会在栈中分配栈帧,因此程序员在设计和开发应用时需考虑调用层数。
来看一段字节码在 Java 栈中的执行示例,100 与 98 相加:
清单 2. 整数加法运算的 Java 字节码
iload_0 // 载入局部变量 0,整型,压入栈中
iload_1 // 载入局部变量 1,整型,压入栈中
iadd // 弹出两个整型数,相加,将结果压入栈
istore_2 // 弹出整型数,存入局部变量 2
更多精彩
赞助商链接