int add(int a, int b) {
return a + b;
}
这个实例方法经过Java编译器编译后生成的字节码
本地变量表
slot0 this
slot1 a
slot2 b
方法字节码
iload_1 #读位置是1的本地变量(本地变量表从0开始,位置0是this引用)
此时操作数栈是 a
iload_2 #读位置是2的本地变量,即b
此时操作数栈是 a b
iadd #进行int类型的add操作,会取出栈头的两个元素取出进行相加并将结果入栈。
此时操作数栈是 c (相加的结果)
ireturn #ireturn指令会将栈头元素返回给调用方法的栈帧
线程共享区域
堆(Heap区)
创建的对象(包括普通实例和数组)都分配在Heap区(不考虑一些虚拟机的栈上分配优化技术)。在细分的话,一般还分成年轻代和老年代。这是基于这样一个类似28原理的统计,90%多的对象都是很快成为垃圾的对象。所以化为成两个区域,分别使用不同的收集算法,年轻代的收集频率更高,所需空间也相对较小。内存分配时,多个线程会有并发问题,主要通过两种方式解决:1.CAS加上失败重试分配内存地址。2. TLAB, 即Thread Local Allocation Buffer, 为每个线程分配一块缓冲区域进行对象分配。年轻代还可以分为两个大小相等的Survivor和一个Eden区域。对象在几种情况下会进入老年代:1. 大对象,超过Eden大小或者PretenureSizeThreshold. 2. 在年轻代的年龄(经历的GC次数)超过设定的值的时候 3. To Survivor存放不下的对象