- 浏览: 426162 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
指令码 |
助记符 |
说明 |
0x00 | nop | 什么都不做 |
0x01 | aconst_null | 将null推送至栈顶 |
0x02 | iconst_m1 | 将int型-1推送至栈顶 |
0x03 | iconst_0 | 将int型0推送至栈顶 |
0x04 | iconst_1 | 将int型1推送至栈顶 |
0x05 | iconst_2 | 将int型2推送至栈顶 |
0x06 | iconst_3 | 将int型3推送至栈顶 |
0x07 | iconst_4 | 将int型4推送至栈顶 |
0x08 | iconst_5 | 将int型5推送至栈顶 |
0x09 | lconst_0 | 将long型0推送至栈顶 |
0x0a | lconst_1 | 将long型1推送至栈顶 |
0x0b | fconst_0 | 将float型0推送至栈顶 |
0x0c | fconst_1 | 将float型1推送至栈顶 |
0x0d | fconst_2 | 将float型2推送至栈顶 |
0x0e | dconst_0 | 将double型0推送至栈顶 |
0x0f | dconst_1 | 将double型1推送至栈顶 |
0x10 | bipush | 将单字节的常量值(-128~127)推送至栈顶 |
0x11 | sipush | 将一个短整型常量值(-32768~32767)推送至栈顶 |
0x12 | ldc | 将int,float或String型常量值从常量池中推送至栈顶 |
0x13 | ldc_w | 将int,float或String型常量值从常量池中推送至栈顶(宽索引) |
0x14 | ldc2_w | 将long或double型常量值从常量池中推送至栈顶(宽索引) |
0x15 | iload | 将指定的int型本地变量推送至栈顶 |
0x16 | lload | 将指定的long型本地变量推送至栈顶 |
0x17 | fload | 将指定的float型本地变量推送至栈顶 |
0x18 | dload | 将指定的double型本地变量推送至栈顶 |
0x19 | aload | 将指定的引用类型本地变量推送至栈顶 |
0x1a | iload_0 | 将第一个int型本地变量推送至栈顶 |
0x1b | iload_1 | 将第二个int型本地变量推送至栈顶 |
0x1c | iload_2 | 将第三个int型本地变量推送至栈顶 |
0x1d | iload_3 | 将第四个int型本地变量推送至栈顶 |
0x1e | lload_0 | 将第一个long型本地变量推送至栈顶 |
0x1f | lload_1 | 将第二个long型本地变量推送至栈顶 |
0x20 | lload_2 | 将第三个long型本地变量推送至栈顶 |
0x21 | lload_3 | 将第四个long型本地变量推送至栈顶 |
0x22 | fload_0 | 将第一个float型本地变量推送至栈顶 |
0x23 | fload_1 | 将第二个float型本地变量推送至栈顶 |
0x24 | fload_2 | 将第三个float型本地变量推送至栈顶 |
0x25 | fload_3 | 将第四个float型本地变量推送至栈顶 |
0x26 | dload_0 | 将第一个double型本地变量推送至栈顶 |
0x27 | dload_1 | 将第二个double型本地变量推送至栈顶 |
0x28 | dload_2 | 将第三个double型本地变量推送至栈顶 |
0x29 | dload_3 | 将第四个double型本地变量推送至栈顶 |
0x2a | aload_0 | 将第一个引用类型本地变量推送至栈顶 |
0x2b | aload_1 | 将第二个引用类型本地变量推送至栈顶 |
0x2c | aload_2 | 将第三个引用类型本地变量推送至栈顶 |
0x2d | aload_3 | 将第四个引用类型本地变量推送至栈顶 |
0x2e | iaload | 将int型数组指定索引的值推送至栈顶 |
0x2f | laload | 将long型数组指定索引的值推送至栈顶 |
0x30 | faload | 将float型数组指定索引的值推送至栈顶 |
0x31 | daload | 将double型数组指定索引的值推送至栈顶 |
0x32 | aaload | 将引用型数组指定索引的值推送至栈顶 |
0x33 | baload | 将boolean或byte型数组指定索引的值推送至栈顶 |
0x34 | caload | 将char型数组指定索引的值推送至栈顶 |
0x35 | saload | 将short型数组指定索引的值推送至栈顶 |
0x36 | istore | 将栈顶int型数值存入指定本地变量 |
0x37 | lstore | 将栈顶long型数值存入指定本地变量 |
0x38 | fstore | 将栈顶float型数值存入指定本地变量 |
0x39 | dstore | 将栈顶double型数值存入指定本地变量 |
0x3a | astore | 将栈顶引用型数值存入指定本地变量 |
0x3b | istore_0 | 将栈顶int型数值存入第一个本地变量 |
0x3c | istore_1 | 将栈顶int型数值存入第二个本地变量 |
0x3d | istore_2 | 将栈顶int型数值存入第三个本地变量 |
0x3e | istore_3 | 将栈顶int型数值存入第四个本地变量 |
0x3f | lstore_0 | 将栈顶long型数值存入第一个本地变量 |
0x40 | lstore_1 | 将栈顶long型数值存入第二个本地变量 |
0x41 | lstore_2 | 将栈顶long型数值存入第三个本地变量 |
0x42 | lstore_3 | 将栈顶long型数值存入第四个本地变量 |
0x43 | fstore_0 | 将栈顶float型数值存入第一个本地变量 |
0x44 | fstore_1 | 将栈顶float型数值存入第二个本地变量 |
0x45 | fstore_2 | 将栈顶float型数值存入第三个本地变量 |
0x46 | fstore_3 | 将栈顶float型数值存入第四个本地变量 |
0x47 | dstore_0 | 将栈顶double型数值存入第一个本地变量 |
0x48 | dstore_1 | 将栈顶double型数值存入第二个本地变量 |
0x49 | dstore_2 | 将栈顶double型数值存入第三个本地变量 |
0x4a | dstore_3 | 将栈顶double型数值存入第四个本地变量 |
0x4b | astore_0 | 将栈顶引用型数值存入第一个本地变量 |
0x4c | astore_1 | 将栈顶引用型数值存入第二个本地变量 |
0x4d | astore_2 | 将栈顶引用型数值存入第三个本地变量 |
0x4e | astore_3 | 将栈顶引用型数值存入第四个本地变量 |
0x4f | iastore | 将栈顶int型数值存入指定数组的指定索引位置 |
0x50 | lastore | 将栈顶long型数值存入指定数组的指定索引位置 |
0x51 | fastore | 将栈顶float型数值存入指定数组的指定索引位置 |
0x52 | dastore | 将栈顶double型数值存入指定数组的指定索引位置 |
0x53 | aastore | 将栈顶引用型数值存入指定数组的指定索引位置 |
0x54 | bastore | 将栈顶boolean或byte型数值存入指定数组的指定索引位置 |
0x55 | castore | 将栈顶char型数值存入指定数组的指定索引位置 |
0x56 | sastore | 将栈顶short型数值存入指定数组的指定索引位置 |
0x57 | pop | 将栈顶数值弹出(数值不能是long或double类型的) |
0x58 | pop2 | 将栈顶的一个(long或double类型的)或两个数值弹出(其它) |
0x59 | dup | 复制栈顶数值并将复制值压入栈顶 |
0x5a | dup_x1 | 复制栈顶数值并将两个复制值压入栈顶 |
0x5b | dup_x2 | 复制栈顶数值并将三个(或两个)复制值压入栈顶 |
0x5c | dup2 | 复制栈顶一个(long或double类型的)或两个(其它)数值并将复制值压入栈顶 |
0x5d | dup2_x1 | <待补充> |
0x5e | dup2_x2 | <待补充> |
0x5f | swap | 将栈最顶端的两个数值互换(数值不能是long或double类型的) |
0x60 | iadd | 将栈顶两int型数值相加并将结果压入栈顶 |
0x61 | ladd | 将栈顶两long型数值相加并将结果压入栈顶 |
0x62 | fadd | 将栈顶两float型数值相加并将结果压入栈顶 |
0x63 | dadd | 将栈顶两double型数值相加并将结果压入栈顶 |
0x64 | isub | 将栈顶两int型数值相减并将结果压入栈顶 |
0x65 | lsub | 将栈顶两long型数值相减并将结果压入栈顶 |
0x66 | fsub | 将栈顶两float型数值相减并将结果压入栈顶 |
0x67 | dsub | 将栈顶两double型数值相减并将结果压入栈顶 |
0x68 | imul | 将栈顶两int型数值相乘并将结果压入栈顶 |
0x69 | lmul | 将栈顶两long型数值相乘并将结果压入栈顶 |
0x6a | fmul | 将栈顶两float型数值相乘并将结果压入栈顶 |
0x6b | dmul | 将栈顶两double型数值相乘并将结果压入栈顶 |
0x6c | idiv | 将栈顶两int型数值相除并将结果压入栈顶 |
0x6d | ldiv | 将栈顶两long型数值相除并将结果压入栈顶 |
0x6e | fdiv | 将栈顶两float型数值相除并将结果压入栈顶 |
0x6f | ddiv | 将栈顶两double型数值相除并将结果压入栈顶 |
0x70 | irem | 将栈顶两int型数值作取模运算并将结果压入栈顶 |
0x71 | lrem | 将栈顶两long型数值作取模运算并将结果压入栈顶 |
0x72 | frem | 将栈顶两float型数值作取模运算并将结果压入栈顶 |
0x73 | drem | 将栈顶两double型数值作取模运算并将结果压入栈顶 |
0x74 | ineg | 将栈顶int型数值取负并将结果压入栈顶 |
0x75 | lneg | 将栈顶long型数值取负并将结果压入栈顶 |
0x76 | fneg | 将栈顶float型数值取负并将结果压入栈顶 |
0x77 | dneg | 将栈顶double型数值取负并将结果压入栈顶 |
0x78 | ishl | 将int型数值左移位指定位数并将结果压入栈顶 |
0x79 | lshl | 将long型数值左移位指定位数并将结果压入栈顶 |
0x7a | ishr | 将int型数值右(符号)移位指定位数并将结果压入栈顶 |
0x7b | lshr | 将long型数值右(符号)移位指定位数并将结果压入栈顶 |
0x7c | iushr | 将int型数值右(无符号)移位指定位数并将结果压入栈顶 |
0x7d | lushr | 将long型数值右(无符号)移位指定位数并将结果压入栈顶 |
0x7e | iand | 将栈顶两int型数值作“按位与”并将结果压入栈顶 |
0x7f | land | 将栈顶两long型数值作“按位与”并将结果压入栈顶 |
0x80 | ior | 将栈顶两int型数值作“按位或”并将结果压入栈顶 |
0x81 | lor | 将栈顶两long型数值作“按位或”并将结果压入栈顶 |
0x82 | ixor | 将栈顶两int型数值作“按位异或”并将结果压入栈顶 |
0x83 | lxor | 将栈顶两long型数值作“按位异或”并将结果压入栈顶 |
0x84 | iinc | 将指定int型变量增加指定值(i++,i--,i+=2) |
0x85 | i2l | 将栈顶int型数值强制转换成long型数值并将结果压入栈顶 |
0x86 | i2f | 将栈顶int型数值强制转换成float型数值并将结果压入栈顶 |
0x87 | i2d | 将栈顶int型数值强制转换成double型数值并将结果压入栈顶 |
0x88 | l2i | 将栈顶long型数值强制转换成int型数值并将结果压入栈顶 |
0x89 | l2f | 将栈顶long型数值强制转换成float型数值并将结果压入栈顶 |
0x8a | l2d | 将栈顶long型数值强制转换成double型数值并将结果压入栈顶 |
0x8b | f2i | 将栈顶float型数值强制转换成int型数值并将结果压入栈顶 |
0x8c | f2l | 将栈顶float型数值强制转换成long型数值并将结果压入栈顶 |
0x8d | f2d | 将栈顶float型数值强制转换成double型数值并将结果压入栈顶 |
0x8e | d2i | 将栈顶double型数值强制转换成int型数值并将结果压入栈顶 |
0x8f | d2l | 将栈顶double型数值强制转换成long型数值并将结果压入栈顶 |
0x90 | d2f | 将栈顶double型数值强制转换成float型数值并将结果压入栈顶 |
0x91 | i2b | 将栈顶int型数值强制转换成byte型数值并将结果压入栈顶 |
0x92 | i2c | 将栈顶int型数值强制转换成char型数值并将结果压入栈顶 |
0x93 | i2s | 将栈顶int型数值强制转换成short型数值并将结果压入栈顶 |
0x94 | lcmp | 比较栈顶两long型数值大小,并将结果(1,0,-1)压入栈顶 |
0x95 | fcmpl | 比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶 |
0x96 | fcmpg | 比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶 |
0x97 | dcmpl | 比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶 |
0x98 | dcmpg | 比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶 |
0x99 | ifeq | 当栈顶int型数值等于0时跳转 |
0x9a | ifne | 当栈顶int型数值不等于0时跳转 |
0x9b | iflt | 当栈顶int型数值小于0时跳转 |
0x9c | ifge | 当栈顶int型数值大于等于0时跳转 |
0x9d | ifgt | 当栈顶int型数值大于0时跳转 |
0x9e | ifle | 当栈顶int型数值小于等于0时跳转 |
0x9f | if_icmpeq | 比较栈顶两int型数值大小,当结果等于0时跳转 |
0xa0 | if_icmpne | 比较栈顶两int型数值大小,当结果不等于0时跳转 |
0xa1 | if_icmplt | 比较栈顶两int型数值大小,当结果小于0时跳转 |
0xa2 | if_icmpge | 比较栈顶两int型数值大小,当结果大于等于0时跳转 |
0xa3 | if_icmpgt | 比较栈顶两int型数值大小,当结果大于0时跳转 |
0xa4 | if_icmple | 比较栈顶两int型数值大小,当结果小于等于0时跳转 |
0xa5 | if_acmpeq | 比较栈顶两引用型数值,当结果相等时跳转 |
0xa6 | if_acmpne | 比较栈顶两引用型数值,当结果不相等时跳转 |
0xa7 | goto | 无条件跳转 |
0xa8 | jsr | 跳转至指定16位offset位置,并将jsr下一条指令地址压入栈顶 |
0xa9 | ret | 返回至本地变量指定的index的指令位置(一般与jsr,jsr_w联合使用) |
0xaa | tableswitch | 用于switch条件跳转,case值连续(可变长度指令) |
0xab | lookupswitch | 用于switch条件跳转,case值不连续(可变长度指令) |
0xac | ireturn | 从当前方法返回int |
0xad | lreturn | 从当前方法返回long |
0xae | freturn | 从当前方法返回float |
0xaf | dreturn | 从当前方法返回double |
0xb0 | areturn | 从当前方法返回对象引用 |
0xb1 | return | 从当前方法返回void |
0xb2 | getstatic | 获取指定类的静态域,并将其值压入栈顶 |
0xb3 | putstatic | 为指定的类的静态域赋值 |
0xb4 | getfield | 获取指定类的实例域,并将其值压入栈顶 |
0xb5 | putfield | 为指定的类的实例域赋值 |
0xb6 | invokevirtual | 调用实例方法 |
0xb7 | invokespecial | 调用超类构造方法,实例初始化方法,私有方法 |
0xb8 | invokestatic | 调用静态方法 |
0xb9 | invokeinterface | 调用接口方法 |
0xba | -- | |
0xbb | new | 创建一个对象,并将其引用值压入栈顶 |
0xbc | newarray | 创建一个指定原始类型(如int,float,char…)的数组,并将其引用值压入栈顶 |
0xbd | anewarray | 创建一个引用型(如类,接口,数组)的数组,并将其引用值压入栈顶 |
0xbe | arraylength | 获得数组的长度值并压入栈顶 |
0xbf | athrow | 将栈顶的异常抛出 |
0xc0 | checkcast | 检验类型转换,检验未通过将抛出ClassCastException |
0xc1 | instanceof | 检验对象是否是指定的类的实例,如果是将1压入栈顶,否则将0压入栈顶 |
0xc2 | monitorenter | 获得对象的锁,用于同步方法或同步块 |
0xc3 | monitorexit | 释放对象的锁,用于同步方法或同步块 |
0xc4 | wide | <待补充> |
0xc5 | multianewarray | 创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶 |
0xc6 | ifnull | 为null时跳转 |
0xc7 | ifnonnull | 不为null时跳转 |
0xc8 | goto_w | 无条件跳转(宽索引) |
0xc9 | jsr_w | 跳转至指定32位offset位置,并将jsr_w下一条指令地址压入栈顶 |
package com.unmi;
import java.io.UnsupportedEncodingException;
public class AboutCatch {
public static void main(String[] args){
try {
transfer("JVM 对 Java 异常的处理","gbk");
} catch (Exception e) {
//e.printStackTrace();
}
}
//字符集转换的方法
public static void transfer(String src, String charset)
throws Exception{
String result = "";
try{
//这行代码可能会抛出空指针,不支持的字符集,数组越界的异常
result = new String(src.getBytes(),0,10,charset);
}catch(NullPointerException ne){
System.out.println("捕获到异常 ArithemticExcetipn");
throw ne;
}catch(UnsupportedEncodingException uee){
System.out.println("捕获到异常 UnsupportedEncodingException");
throw uee;
}catch(Exception ex){ //比如数组越界时在这里可捕获到
System.out.println("捕获到异常 Exception");
throw ex;
}
System.out.println(result);
}
}
来看看上面代码中的 transfer() 方法相应的字节码指令,编译器是 Eclipse 3.3.2 的,它所用的 JDK 是 1.6.0_06,编译兼容级别设置为 6.0。用命令 javap -c com.unmi.AboutCatch 在 Dos 窗口中就能输出:
public static void transfer(java.lang.String, java.lang.String) throws java.lang.Exception;
Code:
0: ldc #30; //"" constant_pool[30]
2: astore_2 // The third variable, because parameters take two
3: new #32; //class java/lang/String constant_pool[32]
6: dup
7: aload_0
8: invokevirtual #34; //Method java/lang/String.getBytes:()[B
11: iconst_0
12: bipush 10
14: aload_1
15: invokespecial #38; //Method java/lang/String."<init>":([BIILjava/lang/String;)V
18: astore_2
19: goto 55 //依据异常表执行完异常处理块后,再回到这里,然后 goto 到 55 号指令继续执行
22: astore_3
23: getstatic #41; //Field java/lang/System.out:Ljava/io/PrintStream;
26: ldc #47; //String 捕获到异常 ArithemticExcetipn
28: invokevirtual #49; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
31: aload_3
32: athrow //抛出 ArthemticException 异常
33: astore_3
34: getstatic #41; //Field java/lang/System.out:Ljava/io/PrintStream;
37: ldc #55; //String 捕获到异常 UnsupportedEncodingException
39: invokevirtual #49; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
42: aload_3
43: athrow //抛出 UnsupportedEncodingException 异常
44: astore_3
45: getstatic #41; //Field java/lang/System.out:Ljava/io/PrintStream;
48: ldc #57; //String 捕获到异常 Exception
50: invokevirtual #49; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
53: aload_3
54: athrow //抛出 Exception 异常
55: getstatic #41; //Field java/lang/System.out:Ljava/io/PrintStream;
58: aload_2
59: invokevirtual #49; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
62: return
Exception table: //这下面是一个异常表,所以异常不像普通代码那样是靠 goto 语句来跳转的
from to target type
//0-19 号指令中,碰到 NullPointerException时,跳到 22 号指令
3 19 22 Class java/lang/NullPointerException
//0-19 号指令中,碰到 UnsupportedEncodingException 时,跳到 33 号指令
3 19 33 Class java/io/UnsupportedEncodingException
//0-19 号指令中,碰到 NullPointerException时,跳到 44 号指令
3 19 44 Class java/lang/Exception
说明:
对于上面的程序,我们可以用下面代码来调用看看输出
1) transfer("JVM 对 Java 异常的处理","gbk"); //正常
2) transfer(null, "gbk"); //空指针异常
3) transfer("JVM 对","gbk"); //数组越界异常
4) transfer("JVM 对","gbk-1"); //不支持的字符集异常
最后可以把代码中的
catch(Exception ex){ //比如数组越界时在这里可捕获到
System.out.println("捕获到异常 Exception");
throw ex;
}
或是 main() 方法写成
public static void main(String[] args) throws Exception{
transfer("JVM 对 Java 异常的处理","gbk");
}
来试试,异常一直未得到处理对 JVM 的影响
字节码中,红色部分是我加上去的注释,着重描了要关注的地方,其他的出入栈、方法调用的指令可不予以理会,关键是只要知晓有一个异常表的存在,try 的范围就是体现在异常表行记录的起点和终点。JVM 在 try 住的代码区间内如有异常抛出的话,就会在当前栈桢的异常表中,找到匹配类型的异常记录的入口指令号,然后跳到该指令处执行。异常指令块执行完后,再回来继续执行后面的代码。JVM 按照每个入口在表中出现的顺序进行检索,如果没有发现匹配的项,JVM 将当前栈帧从栈中弹出,再次抛出同样的异常。当 JVM 弹出当前栈帧时,JVM 马上终止当前方法的执行,并且返回到调用本方法的方法中,但是并非继续正常执行该方法,而是在该方法中抛出同样的异常,这就使得 JVM 在该方法中再次执行同样的搜寻异常表的操作。
上面那样的内层方法无法处理异常的层层向外抛,层层压栈,这样就形成一个异常栈。异常栈十分有利于我们透析问题之所在,例如 e.printStackTrace(); 或者带参数的 e.printStackTrace(); 方法可将异常栈信息定向输出到他处,还有 log4j 的 log.error(Throwable) 也有此功效。若是在行径的哪层有能力处理该异常则已,否则直至 JVM,直接造成 JVM 崩溃掉。例如当 main() 方法也把异常抛了出去,JVM 此刻也就到了生命的尽头。
发表评论
-
JVM 深入笔记
2012-04-12 20:36 992JVM 深入笔记(1)内存区域是如何划分的? 一个超短的前言 ... -
JVM启动参数
2011-06-10 16:27 961java [jvmargs] class [arguments ... -
The Top Java Memory Problems – Part 1
2011-05-18 11:01 900转载:http://blog.dynatrace.com/20 ... -
BTrace使用简介
2011-04-19 13:51 775该文转载自:http://rdc.taobao.com/tea ... -
大方法的执行性能与调优过程小记
2011-04-18 16:20 804该文章转载自:http://rdc.taobao.com/te ... -
十个最好的Java性能故障排除工具
2011-04-18 16:02 923推荐十个最好的Java性能 ... -
两个OOM Cases排查过程的分享
2011-04-18 15:39 927分享一下两个OOM Cases的查找过程,一个应用是Nativ ... -
Monitoring Java garbage collection with jstat
2011-04-18 15:28 855The original article is at : ht ... -
理解Heap Profling名词-Shallow和Retained Sizes
2011-04-18 14:58 972所有包含Heap Profling功能的工具(MAT, You ... -
Java深度历险(四)——Java垃圾回收机制与引用类型
2011-04-01 08:18 978Java语言的一个重要特性 ... -
Thread Dump 和Java应用诊断
2011-03-30 08:08 1129Thread Dump 和Java应用诊断 ... -
Memory Analysis Part 1 – Obtaining a Java Heapdump
2011-03-14 16:06 1118For troubleshooting Java memory ... -
Java Memory Leaks et al. (2. Act)
2011-03-14 15:37 923The first act of this blog-seri ... -
Erlang memory architecture vs Java memory architecture
2011-03-14 15:36 908I read a really, really interes ... -
The Java Memory Architecture (1. Act)
2011-03-14 15:15 1409One of the biggest strength of ... -
Permanent generation
2011-03-14 14:53 1270版权声明:转载时请以 ... -
JVM内存模型以及垃圾回收
2011-03-13 09:38 969内存由 Perm 和 Heap 组成. 其中 Heap ... -
Java虚拟机垃圾回收机制
2011-03-13 09:31 822一、相关概念 基本 ... -
JVM结构
2011-03-10 14:43 886类文件格式 JVM使用一 ... -
OOM与JVM(转)
2009-03-24 15:49 956OOM与JVM(转) 2008年08月08日 星期五 15: ...
相关推荐
4. **第4章:JVM字节码与指令集** - 这一章深入讲解字节码指令,包括如何阅读和理解字节码,以及它们在程序执行中的作用。源代码可能包含对特定字节码指令的实例分析。 5. **第7章:性能调优工具** - 讲解如...
字节码是JVM理解并执行的指令集,它是Java源代码经过编译后的二进制形式。 在给定的描述中,`bipush 100` 是一个字节码指令,用于将整数常量100压入操作数栈。这里的8表示该指令在字节码流中的位置,便于理解和调试...
1. **字节码解析**:JVM将.java源文件编译成.class字节码文件,字节码是一种平台无关的指令集,JVM通过解释器执行这些指令。 2. **类加载机制**:JVM有三个主要的类加载器——引导类加载器、扩展类加载器和应用类...
这种技术在Java等语言中得到了广泛应用,Java虚拟机(JVM)就是一个典型的例子。 虚拟机的实现通常包括以下几个关键部分: 1. **指令集架构(ISA)**:这是虚拟机的核心,定义了虚拟机能够理解和执行的指令集。...
字节码指令集是JVM执行的指令单元,每个指令通常占一个字节,分为零操作码、操作数、变长操作码等形式。常见的指令有: - `aload_0`:加载局部变量表的第一个对象引用到操作数栈。 - `iconst_1`:将整数1压入...
3. 构造方法:每个类都可以有多个构造方法,这是方法重载的一个例子,用于在创建对象时初始化状态。 4. Java字节码:Java源代码编译后生成`.class`文件,包含了Java字节码,这是JVM能理解的二进制形式。 5. ...
- **虚拟机概念**:虚拟机是一种抽象的计算模型,有自己的指令集和架构,能够在不同的物理硬件上运行。 - **Java虚拟机(JVM)**:负责执行Java字节码的虚拟机。 - **Java运行环境**:包括Java虚拟机(JVM)、Java基本...
Soot是一个开源的Java中间表示(JVM字节码)处理工具集,由加拿大McGill大学开发。它支持多种分析和优化任务,如静态代码分析、性能优化、编译器优化以及安全性和隐私性研究。Soot将Java代码转换为不同的中间表示...
1. **指令集**:JVM字节码由一系列单字节的指令构成,每条指令对应一个特定的操作。例如,`aload_0`表示加载局部变量表中的第一个引用,`iconst_1`则表示将整数1压入操作数栈。这些指令构成了JVM执行程序的基础。 2...
- 指令集:类似于CPU的指令集,定义了JVM能执行的操作。 - 注册集:临时存储区域,用于存放操作数等。 - 类文件格式:规定了Java类文件的结构。 - 栈:用于存储局部变量和部分结果。 - 垃圾收集堆:管理对象的...
3. **Java程序执行**:在命令行中,执行一个Java程序时,正确格式是`java`加上类名(如果该类包含了主程序,即有`public static void main(String[] args)`方法)。对于类名为Hello的程序,正确的命令是`java Hello`...
字节码是一种平台无关的指令集,使得Java程序可以在任何安装了JVM的操作系统上运行。 5. **java**:这里指`java`命令,用来启动Java应用程序。 6. **独立于平台**:Java语言的一个重要特点是其平台无关性,即编写的...
1. **微控制器(MCU)**:51单片机是嵌入式系统中的经典例子,考生可能需要理解其架构、指令集以及如何编写程序。 2. **操作系统(OS)**:嵌入式系统常用的操作系统有RTOS(实时操作系统),例如FreeRTOS,VxWorks...
《Java实用教程》是由肖磊和李钟尉合著的一本深入浅出的Java学习教材,这本书旨在帮助初学者和进阶者掌握Java编程的核心概念和技术。书中通过大量的实例来阐述理论,使得读者能更好地理解和应用Java语言。提供的源...
│ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...
- **`Instr`函数**: 用于查找一个字符串在另一个字符串中的位置。 ### 20. 数据类型 **知识点:** - **单精度数字类型**: 在数据库中通常占用4个字节。 ### 21. 二进制位 **知识点:** - **`bit`**: 计算机中最...
- **机器语言**:由0和1构成,是计算机可以直接识别和执行的指令集。 - **汇编语言**:相对于机器语言,汇编语言采用了更容易理解的助记符来表示机器指令,但仍需经过汇编器转换为机器语言才能被执行。 - **高级语言...
它简化了底层硬件操作,让程序员能用一种更高级、更易懂的指令集进行编程。现在,我们可以通过模拟器在现代计算机上运行CHIP-8程序,而“chip-8-java”项目就是这样一个模拟器,它是用Java语言编写的。 首先,让...
- 方法是一组为了完成特定功能而组织在一起的指令集。它是Java程序的基本单位之一。 2. **Java中方法的格式** - 方法的格式包括返回类型、方法名、参数列表、方法体。 3. **方法里的属性** - 方法可以有自己的...
字节码是一种中间代码形式,它不是针对特定平台的机器代码,而是面向虚拟机(JVM)的指令集。这种设计使得Java程序可以在安装了JVM的不同平台上运行,实现了“一次编写,到处运行”的目标。 ### 23. Word 2003 的...