JVM--基础--22--字节码指令

2023-11-15

JVM–基础–22–字节码指令



1、字节码简介

  1. Java字节码由操作码和操作数组成。
  2. 操作码:1个字节长度,代表某种特定操作含义的数字
  3. 操作数:零至多个代表此操作码所需参数

2、字节码与数据类型

  1. 在字节码指令集中,大多数指令都有操作所对应的数据类型信息,比如iload表示从局部变量表中加载int型的数据到操作栈中.
  2. 除了long和double类型外,每个变量都占局部变量区中的一个变量槽(slot),而long及double会占用两个连续的变量槽。
  3. 大多数对于boolean、byte、short和char类型数据的操作,都使用相应的int类型作为运算类型。
  4. 每种数据类型和操作都有对应的指令,有一些指令可以在必要的时候将一些不被支持的数据类型转换为被支持的数据类型。

2.1、数据类型表

  1. 以数据类型为列,
  2. 以操作指令为行
  3. 其中为空的项即说明虚拟机不支持对这种数据类型进行这项操作。
     

3、加载和存储指令

3.1、指令

将一个局部变量加载到操作栈
	iload、iload_<n>
	lload、lload_<n>
	fload、fload_<n>
	dload、dload_<n>
	aload、aload_<n>
将一个数值从操作数栈存储到局部变量表
	istore、istore_<n>
	lstore、lstore_<n>
	fstore、fstore_<n>
	dstore、dstore_<n>
	astore、astore_<n>
将一个常量加载到操作数栈
	bipush
	sipush
	ldc
	ldc_w
	ldc2_w
	aconst_null
	iconst_m1
	iconst_<i>
	lconst_<l>
	fconst_<f>
	dconst_<d>
扩充局部变量表的访问索引的指令:wide。


3.2、测试


public class Hello{
    
    public int add(int a,int b)
    {
        int c=a+b;
        int d=1;
        int f=c+d;
        return f;
    }
}

3.3、解析

F:\>javap -v Hello.class
Classfile /F:/Hello.class
  Last modified 2019-7-23; size 264 bytes
  MD5 checksum d09a5fcab945489db588d5e862fad676
  Compiled from "Hello.java"
public class Hello
  SourceFile: "Hello.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#12         //  java/lang/Object."<init>":()V
   #2 = Class              #13            //  Hello
   #3 = Class              #14            //  java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               add
   #9 = Utf8               (II)I
  #10 = Utf8               SourceFile
  #11 = Utf8               Hello.java
  #12 = NameAndType        #4:#5          //  "<init>":()V
  #13 = Utf8               Hello
  #14 = Utf8               java/lang/Object
{
  public Hello();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public int add(int, int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=6, args_size=3
         0: iload_1     //将一个局部变量a加载到操作栈
         1: iload_2        //将一个局部变量b加载到操作栈
         2: iadd        //a+b
         3: istore_3    //将a+b的数值从操作数栈存储到局部变量表c中
         4: iconst_1    //定义常量d=1
         5: istore        4//将d的数值从操作数栈存储到局部变量表中d
         7: iload_3            //将一个局部变量c加载到操作栈
         8: iload         4    //将一个局部变量d加载到操作栈
        10: iadd            //c+d
        11: istore        5 //将c+d的数值从操作数栈存储到局部变量表
        13: iload         5 //将一个局部变量(c+d)加载到操作栈
        15: ireturn            //返回数值
      LineNumberTable:
        line 5: 0
        line 6: 4
        line 7: 7
        line 8: 13
}

4、运算指令

用于对操作数栈上的值进行某种特定的运算。(这里不多说看上面的测试代码)

加法运算:iadd,ladd,fadd,dadd。
减法运算:isub,lsub,fsub,dsub。
乘法运算:imul,lmul,fmul,dmul。
除法运算:idiv,ldiv,fdiv,ddiv。
求余指令:irem,lrem,frem,drem。
取反指令:imeg,lmeg,fmeg,dmeg。
位移指令:ishl,ishr,iushr,lshl,lshr,lushr。
按位或指令:ior,lor。
按位与指令:iand,land。
按位异或指令:ixor,lxor。
局部变量自增指令:iinc。
比较指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp。
	注:只有在除法指令(idiv,ldiv)和求余指令(irem,lrem)当出现除数为零时会导致虚拟机抛出AirtmeticException异常,其余整形和浮点型运算场景都不会抛出异常

5、类型转换指令

  1. 可以将两种不同数值类型进行相互转换。
  2. 虚拟机天然支持基本数据类型的宽化类型转换,例如int到long、flost、double等。
  3. 对于窄化数据类型转化则必须用显示的转换指令。

5.1、显示的转换指令

i2b(int -> boolean)
i2c(int -> char)
i2s(int -> short)
l2i(long -> int)
f2i(float -> int)
f2l(float -> long)
d2i(double -> int)
d2l(double -> long)
d2f(double -> float)

5.2、注意点

  1. int/long 类型窄化转换为整数类型T时,转换过程为丢弃除最低位N(T的数据类型长度)个字节以外的内容。
  2. 浮点值窄化转换为整数类型T(int/long)时
    if(浮点值==NaN){
        result = 0;
    }else{
        value = [浮点值];  //向下取整
        if(T.min <= value <= T.max){    //value在T的表示范围内
            result = value;
        }else{
            if(value > 0) result = T.max;
            if(value < 0) result = T.min;
        }
    }

5.3、测试代码

public class Hello{
    
    public long  add()
    {
        int a=11;
        long  b=20;
        long  c=a+b;
        return c;
    }
 
}

5.4、解析

F:\>javap -v Hello.class
Classfile /F:/Hello.class
  Last modified 2019-7-23; size 271 bytes
  MD5 checksum dc4f5dbebf95b9a1357abb2a994824b8
  Compiled from "Hello.java"
public class Hello
  SourceFile: "Hello.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#14         //  java/lang/Object."<init>":()V
   #2 = Long               20l
   #4 = Class              #15            //  Hello
   #5 = Class              #16            //  java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               add
  #11 = Utf8               ()J
  #12 = Utf8               SourceFile
  #13 = Utf8               Hello.java
  #14 = NameAndType        #6:#7          //  "<init>":()V
  #15 = Utf8               Hello
  #16 = Utf8               java/lang/Object
{
  public Hello();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public long add();
    flags: ACC_PUBLIC
    Code:
      stack=4, locals=6, args_size=1
         0: bipush        11       //将一个常量a=11加载到操作数栈
         2: istore_1                 //将一个数值11从操作数栈存储到局部变量表
         3: ldc2_w        #2        // long 20l   一个常量b=20加载到操作数栈
         6: lstore_2                 //将一个数值b=20从操作数栈存储到局部变量表
         7: iload_1            //将一个局部变量a=11加载到操作栈
         8: i2l                //操作栈 a=11从int 转换long
         9: lload_2            //将一个局部变量b=20加载到操作栈
        10: ladd            //a+b
        11: lstore        4 //将一个数值(a+b)从操作数栈存储到局部变量表
        13: lload         4  //将一个局部变量(a+b)加载到操作栈
        15: lreturn            //返回
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 7
        line 8: 13
}

6、对象创建与访问指令

6.1、指令

创建类实例的指令:
	new
创建数组的指令:
	newarray
	anewarray
	multianewarray
访问类字段(static字段)和实例字段(非static字段)的指令
	getfield
	putfield
	getstatic
	putstatic
将一个数组元素加载到操作数栈的指令:
	baload
	caload
	saload
	iaload
	faload
	daload
	aaload
将一个操作数栈的值存储到数组元素中的指令
	bastore
	castore
	iastore
	sastore
	fastore
	fastore
	dastore,aastore
取数组长度的指令:
	arraylength
检查类实例类型的指令:
	instanceof
	checkcast

6.2、代码

public class Hello{
    
    private int age;
    
    public static void  main(String[] args)
    {
        
         Hello hello=new Hello();
         hello.setAge(11);
         int c=hello.getAge();
        
        
    }
    
    public int getAge(){
        return age;
    }
    public void  setAge(int age){
        this.age=age;
    }
    
}

6.3、解析

F:\>javap -v Hello.class
Classfile /F:/Hello.class
  Last modified 2019-7-23; size 461 bytes
  MD5 checksum 405d9ef6996eb40b92f9991ad03c76db
  Compiled from "Hello.java"
public class Hello
  SourceFile: "Hello.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #7.#22         //  java/lang/Object."<init>":()V
   #2 = Class              #23            //  Hello
   #3 = Methodref          #2.#22         //  Hello."<init>":()V
   #4 = Methodref          #2.#24         //  Hello.setAge:(I)V
   #5 = Methodref          #2.#25         //  Hello.getAge:()I
   #6 = Fieldref           #2.#26         //  Hello.age:I
   #7 = Class              #27            //  java/lang/Object
   #8 = Utf8               age
   #9 = Utf8               I
  #10 = Utf8               <init>
  #11 = Utf8               ()V
  #12 = Utf8               Code
  #13 = Utf8               LineNumberTable
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               getAge
  #17 = Utf8               ()I
  #18 = Utf8               setAge
  #19 = Utf8               (I)V
  #20 = Utf8               SourceFile
  #21 = Utf8               Hello.java
  #22 = NameAndType        #10:#11        //  "<init>":()V
  #23 = Utf8               Hello
  #24 = NameAndType        #18:#19        //  setAge:(I)V
  #25 = NameAndType        #16:#17        //  getAge:()I
  #26 = NameAndType        #8:#9          //  age:I
  #27 = Utf8               java/lang/Object
{
  public Hello();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: new           #2                  // class Hello  创建类实例的指令
         3: dup
         4: invokespecial #3                  // Method "<init>":()V
         7: astore_1
         8: aload_1
         9: bipush        11
        11: invokevirtual #4                  // Method setAge:(I)V
        14: aload_1
        15: invokevirtual #5                  // Method getAge:()I
        18: istore_2
        19: return
      LineNumberTable:
        line 8: 0
        line 9: 8
        line 10: 14
        line 13: 19

  public int getAge();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #6                  // Field age:I  访问类字段(static字段)和实例字段(非static字段)的指令
         4: ireturn
      LineNumberTable:
        line 16: 0

  public void setAge(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #6                  // Field age:I  访问类字段(static字段)和实例字段(非static字段)的指令
         5: return
      LineNumberTable:
        line 19: 0
        line 20: 5
}

7、操作数栈管理指令

将一个操作数栈的栈顶一个或两个元素出栈:
	pop
	pop2
复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:
	dup
	dup2
	dup_x1
	dup2_x1
	dup_x2
	dup2_x2
将栈顶端的两个数值交换
	swap

8、控制转移指令

可以让Java虚拟机有条件或者无条件的从指定的位置而不是控制转移指令的下一条指令继续执行程序。

8.1、指令

条件分支:
	ifeq
	ifit
	ifle
	ifgt
	ifnull
	ifnonnull
	if_icmpeq
	if_icmpne
	if_icmplt
	if_icmpgt
	if_icmple
	if_icmpge
	if_acmpeq
	if_acmpne
复合条件分支:
	tableswitch
	lookupswitch
无条件分支:
	gosto
	goto_w
	jsr
	jsr_w
	ret

8.2、代码

public class Hello{
    
    public static void  main(String[] args)
    {
         int a=11;
         int b=0;
         if(a>0){
             b=2;
         }else{
             b=1;
         }
    }
}

8.3、解析

F:\>javap -v Hello.class
Classfile /F:/Hello.class
  Last modified 2019-7-23; size 321 bytes
  MD5 checksum 344b92a34b16863c6264573b7620b263
  Compiled from "Hello.java"
public class Hello
  SourceFile: "Hello.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#13         //  java/lang/Object."<init>":()V
   #2 = Class              #14            //  Hello
   #3 = Class              #15            //  java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               main
   #9 = Utf8               ([Ljava/lang/String;)V
  #10 = Utf8               StackMapTable
  #11 = Utf8               SourceFile
  #12 = Utf8               Hello.java
  #13 = NameAndType        #4:#5          //  "<init>":()V
  #14 = Utf8               Hello
  #15 = Utf8               java/lang/Object
{
  public Hello();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: bipush        11     //常量11加载到操作数栈
         2: istore_1            //将一个数值11从操作数栈存储到局部变量表
         3: iconst_0            //常量0加载到操作数栈
         4: istore_2                //将一个数值0从操作数栈存储到局部变量表
         5: iload_1                //将一个局部变量11加载到操作栈
         6: ifle          14   //11 小于 ,跳转14,否则继续走下去
         9: iconst_2            //常量2加载到操作数栈
        10: istore_2            //将一个数值2从操作数栈存储到局部变量表
        11: goto          16   //走到16行
        14: iconst_1
        15: istore_2
        16: return      //结束
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 5
        line 8: 9
        line 10: 14
        line 12: 16
      StackMapTable: number_of_entries = 2
           frame_type = 253 /* append */
             offset_delta = 14
        locals = [ int, int ]
           frame_type = 1 /* same */

}

9、方法调用和返回指令

9.1、指令

invokevirtua
	用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派)。
invokeinterface
	用于调用接口方法,它在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokespecial
	用于调用一些需要特殊处理的实例方法,包括实例的初始化方法,私有方法和父类方法。
invokestatic
	用于调用类方法(static方法)
invokedynamic
	用于运行时动态解析出调用点限定符所应用的方法,并执行该方法。(前面的分派逻辑都固化在虚拟机内部,而该指令的分派逻辑是由用户自定义)。
方法返回指令:
	ireture(返回类型是int,short,byte,char,boolean时)
	lreturn
	freturn
	dreturn
	areturn
	还有一条return供void方法、实例/类/接口的初始化方法使用

9.2、代码

public class Hello{
    
    private int age;
    
    public static void  main(String[] args)
    {
        
         Hello hello=new Hello();
         hello.setAge(11);
         int c=hello.getAge();
        
        
    }
    
    public int getAge(){
        return age;
    }
    public void  setAge(int age){
        this.age=age;
    }
    
}

9.3、解析

F:\>javap -v Hello.class
Classfile /F:/Hello.class
  Last modified 2019-7-23; size 461 bytes
  MD5 checksum 405d9ef6996eb40b92f9991ad03c76db
  Compiled from "Hello.java"
public class Hello
  SourceFile: "Hello.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #7.#22         //  java/lang/Object."<init>":()V
   #2 = Class              #23            //  Hello
   #3 = Methodref          #2.#22         //  Hello."<init>":()V
   #4 = Methodref          #2.#24         //  Hello.setAge:(I)V
   #5 = Methodref          #2.#25         //  Hello.getAge:()I
   #6 = Fieldref           #2.#26         //  Hello.age:I
   #7 = Class              #27            //  java/lang/Object
   #8 = Utf8               age
   #9 = Utf8               I
  #10 = Utf8               <init>
  #11 = Utf8               ()V
  #12 = Utf8               Code
  #13 = Utf8               LineNumberTable
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               getAge
  #17 = Utf8               ()I
  #18 = Utf8               setAge
  #19 = Utf8               (I)V
  #20 = Utf8               SourceFile
  #21 = Utf8               Hello.java
  #22 = NameAndType        #10:#11        //  "<init>":()V
  #23 = Utf8               Hello
  #24 = NameAndType        #18:#19        //  setAge:(I)V
  #25 = NameAndType        #16:#17        //  getAge:()I
  #26 = NameAndType        #8:#9          //  age:I
  #27 = Utf8               java/lang/Object
{
  public Hello();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: new           #2                  // class Hello  创建类实例的指令
         3: dup
         4: invokespecial #3                  // Method "<init>":()V  实例的初始化方法
         7: astore_1
         8: aload_1
         9: bipush        11
        11: invokevirtual #4                  // Method setAge:(I)V   用于调用对象的实例方法
        14: aload_1
        15: invokevirtual #5                  // Method getAge:()I    用于调用对象的实例方法
        18: istore_2
        19: return             、//方法返回指令
      LineNumberTable:
        line 8: 0
        line 9: 8
        line 10: 14
        line 13: 19

  public int getAge();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: getfield      #6                  // Field age:I  访问类字段(static字段)和实例字段(非static字段)的指令
         4: ireturn
      LineNumberTable:
        line 16: 0

  public void setAge(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: iload_1
         2: putfield      #6                  // Field age:I  访问类字段(static字段)和实例字段(非static字段)的指令
         5: return
      LineNumberTable:
        line 19: 0
        line 20: 5
}

10、异常处理指令

  1. 显式抛出异常指令:athrow

  2. 在Java程序中显式抛出异常的操作(throw语句)都由athrow指令来实现,除了用throw语句显式抛出异常情况之外,Java虚拟机规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。

10.1、测试

public class Hello{
 
    public static void  main(String[] args)
    {
        
         throw new RuntimeException("我是异常");
    
    }
}

11、同步指令

Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。

11.1、方法级同步

  1. 方法级的同步是隐式的,即无须通过字节码指令来控制
  2. 它实现在方法调用和返回操作之中。虚拟机可以从方法常量池的方法表结构中的ACC_SYNCHRONIZED访问标志得知一个方法是否声明为同步方法。当方法调用时,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线程就要求先成功持有管程,然后才能执行方法,最后当方法完成(无论是正常完成还是非正常完成)时释放管程。在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程。如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那么这个同步方法所持有的管程将在异常抛到同步方法之外时自动释放。

11.2、方法内部一段指令序列的同步

同步一段指令集序列通常是由Java语言中的synchronized语句块来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义,正确实现synchronized关键字需要Javac编译器与Java虚拟机两者共同协作支持。

11.3、测试

​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM--基础--22--字节码指令 的相关文章

  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • git报错ssh: connect to host github.com port 22: Connection timed out

    碰到了git拉代码时报出的一个错误 通过查阅资料尝试了几种方法之后解决了 在这做个记录 首先需要检查一下SSH是否能够连接成功 输入以下命令 ssh T git github com 若还是报这个错ssh connect to host g
  • Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?

    Solidity是一种用于编写智能合约的编程语言 它被广泛应用于以太坊区块链上的智能合约开发 在Solidity中 有两种函数修饰符 即 pure 和 view 它们被用来指示函数的行为 这篇文章将深入探讨 pure 和 view 的含义
  • PyTorch中使用预训练的模型初始化网络的一部分参数(增减网络层,修改某层参数等) 固定参数

    在预训练网络的基础上 修改部分层得到自己的网络 通常我们需要解决的问题包括 1 从预训练的模型加载参数 2 对新网络两部分设置不同的学习率 主要训练自己添加的层 一 加载参数的方法 加载参数可以参考apaszke推荐的做法 即删除与当前mo
  • 查看 elasticsearch版本号

    查看 elasticsearch版本号 输入命令 curl XGET localhost 9200 得到 name OmUcqLr cluster name elasticsearch cluster uuid AQHIcDW Q9K80U
  • 使用U盘重装MacBook Air时用到的工具和镜像

    主要是工具和镜像 非重装教程 前言 工具 镜像 前言 我之前没接触过苹果笔记本 设备是邻居的白苹果 近期因为双系统中的windows出故障了 所以索性帮他重装 用U盘重装MacBook Air教程网上有一堆 大家应该都能搜索到 主要是工具和
  • aanet

    AANet feature extractor AANetFeature conv1 Sequential 0 Conv2d 3 32 kernel size 7 7 stride 3 3 padding 3 3 bias False 1
  • VSCODE:终端界面简洁化和cmd.exe界面显示

    最近在配置vscode 想用来编写一些c和c 算法文件 编写helloword cpp文件 运行发现程序输出结果显示在终端界面 且含有一长串复杂的无用字符 因此考虑简化这个终端界面 在网上查询了众多教程 大部分都是修改launch json
  • 如何使用 Serverless 做架构和项目管理—— 三年全栈经验总结

    本文是从项目工程角度来讲解的 技术角度请参看另一个文章 真实项目代码教你四步扔了传统服务器 让你优雅使用Serverless做全栈开发 https zhuanlan zhihu com p 本文汇总了我的多个Serverless的全栈项目实
  • [c++]力扣303+304 区域和检索 二维区域和检索

    最近开始重新刷题 从链表开始 第一部分是前缀和 分为一维数组前缀和和高维数组前缀和 abandon 前缀和数组是牺牲空间换时间的方法 为了解决频繁访问数组某区间的问题 先构造出从开始到当前位置的元素的和 储存在前缀和数组中 查询的时候直接查
  • 小波神经网络(WNN)的实现(Python,附源码及数据集)

    文章目录 一 理论基础 1 小波神经网络结构 2 前向传播过程 3 反向传播过程 4 建模步骤 二 小波神经网络的实现 1 训练过程 WNN py 2 测试过程 test py 3 测试结果 4 参考源码及实验数据集 一 理论基础 小波神经
  • Java设计模式-单例模式

    模式定义 确保一个类最多只有一个实例 并提供一个全局访问点 单例模式分为饿汉式和懒汉式 懒汉式单例模式 在类加载时不初始化 饿汉式单例模式 在类加载时就完成了初始化 所以类加载比较慢 但获取对象的速度快 饿汉式 线程安全 饿汉式单例模式 线
  • 2022必备react面试题 附答案

    2022必备react面试题 1 React的严格模式如何使用 有什么用处 StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样 StrictMode 不会渲染任何可见的 UI 它为其后代元素触发额外
  • 初学者对java数组中栈和堆的认识

    java数组中栈和堆的认识 1 示例 2 结论 3 图例子 1 示例 public static void main String args String Array null Array new String 3 Array 0 安徽合肥
  • NRF52832学习笔记(2)—— 添加DFU功能(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在 uart 的例程中添加 DFU 功能 使用 s132 的协议栈 因为官方的 BootLoader 工程用的是s132的协议栈 一 准备工作 在开始实验之前必须先准备以下软件 gcc a
  • linux总结-常用命令(2)

    ls命令 ls命令为list的缩写 通过ls命令可以查看Linux文件夹中包含的文件及其文件权限 包括目录 文件夹 文件权限 目录信息等等 ls 选项 目录 文件 选项 a 列出目录所有文件 包含以 开始的隐藏文件 A 列出除 及 的其它文
  • MDF,LDF格式文件还原数据库

    点你的数据服务名 gt 右键 gt 附加数据库 gt 选择你要还原的数据库文件
  • mxnet——模型加载与保存

    一 加载模型与pretrain模型network相同 loading predict module data shape G 96 Batch namedtuple Batch data sym arg params aux params
  • 比特数据结构课-前言、时间复杂度

    前言 1 什么是数据结构 数据结构 Data Structure 是计算机存储 组织数据的方式 指相互之间存在一种或多种特定关系的数据元素的集合 2 什么是算法 算法 Algorithm 就是定义良好的计算过程 他取一个或一组的值为输入 并
  • 虚拟机出现错误:“无法连接MKS:套接字连接尝试次数太多,正在放弃“,无法进入系统的解决方法

    开发环境 我在windows上使用的是VMware Workstation 14 Pro Ubuntu16 04的组合进行开发 原因 自从将vm从12pro升级成了14pro之后就出现了这种问题 应该是14pro版本本身还有些问题吧 解决方
  • JVM--基础--22--字节码指令

    JVM 基础 22 字节码指令 1 字节码简介 Java字节码由操作码和操作数组成 操作码 1个字节长度 代表某种特定操作含义的数字 操作数 零至多个代表此操作码所需参数 2 字节码与数据类型 在字节码指令集中 大多数指令都有操作所对应的数