jvm初步认识
JNI(java native interface) java本地接口:
概念: JNI是java语言的一部分,可以通过JNI来实现和其它语言(C,C++)的交互
JNI提供了JAVA程序与操作系统交互的函数接口,
应用场景:
1.在程序对性能敏感的时候,有必要使用到更底层的语言。
2.在已经有其他语言实现功能的情况下,java可以直接去调用。
3.在需要用到java不具备的依赖于操作系统的特性
使用步骤:
1.在java程序中声明native方法,编译成字节码文件(class)
2.用java程序,将class文件生成头文件(命令:java -jni xxx )
3.用其他语言实现native方法,生成动态库,供java程序使用
4.发布java和动态库
native关键字:
1.native修饰的方法说明这个方法不是用JAVA语言实现的,而是用其他语言实现的,不能用abstract来装饰,因为这个方法是有方法体的但只不过不是用java语言实现的而已。
java程序编译成字节码文件,jvm在执行字节码文件的时候,会根据操作系统的不同将字节码文件解释成不同的机器指令,从而做到跨平台。
程序计数器:记录的是正在执行的虚拟机字节码指令的地址,字节码解释器就是通过改变程序计数器的值来获得下一条需要执行的字节码指令,内存空间小,是线程私有的。
虚拟机栈:线程私有的,生命周期和线程一样,描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至调用结束,就对应着一个栈帧从虚拟机中入栈到出栈的过程
局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)
本地方法栈:区别于虚拟机栈,java虚拟机栈是为了java方法服务的,本地方法栈是为了虚拟机需要使用到的native方法服务的。
堆: 是线程共享的部分,用来存储对象实例和数组,
方法区:属于共享内存区域,用来存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等
虚拟机栈,程序计数器,本地方法栈这三个内存区域都是随线程共生的,栈帧中的栈随方法的进入和退出而执行着入栈和出栈的操作。而堆和方法区则不一样,属于是线程共享的,一个接口可能有多个实现类,并且每个实现类需要的内存也是不一样的,只有在程序运行的时候才知道具体需要创建哪一个实现类(与运行时类型),这部分的内存的分配和回收都是动态的,由垃圾回收器(GC)负责。
类加载器:
类加载器负责把class字节码文件加载到内存当中,并且将这些内容转换到方法区中,类加载器只负责将class字节码文件的加载,不负责运行,至于是否可以运行,由执行引擎来决定。
类加载器的分类:(三种+用户自定义)
1.启动类加载器 Bootstrap class loader(c++)
2.扩展类加载器 Extension class loader(java)
3.应用程序类加载器 App class loader
用户自定义类加载器(实现java.lang.ClassLoad实现)这是一个抽象类
双亲委派机制:当一个类加载器需要加载一个类的时候,不会自己去尝试加载这个类。而是先委托父级类加载器去加载,然后收到委托的类加载器也会遵循这个规则,先去委托自己的父级类加载去尝试加载这个类。最后都会委托到启动类加载。当父级类加载器中没有找到所需要的类的时候,子类才会尝试自己去加载。
双亲委派机制的好处是:沙箱安全机制,能够保证相同的类加载的都是同一个对象。
jvm初步认识
JNI(java native interface) java本地接口:
概念: JNI是java语言的一部分,可以通过JNI来实现和其它语言(C,C++)的交互
JNI提供了JAVA程序与操作系统交互的函数接口,
应用场景:
1.在程序对性能敏感的时候,有必要使用到更底层的语言。
2.在已经有其他语言实现功能的情况下,java可以直接去调用。
3.在需要用到java不具备的依赖于操作系统的特性
使用步骤:
1.在java程序中声明native方法,编译成字节码文件(class)
2.用java程序,将class文件生成头文件(命令:java -jni xxx )
3.用其他语言实现native方法,生成动态库,供java程序使用
4.发布java和动态库
native关键字:
1.native修饰的方法说明这个方法不是用JAVA语言实现的,而是用其他语言实现的,不能用abstract来装饰,因为这个方法是有方法体的但只不过不是用java语言实现的而已。
java程序编译成字节码文件,jvm在执行字节码文件的时候,会根据操作系统的不同将字节码文件解释成不同的机器指令,从而做到跨平台。
程序计数器:记录的是正在执行的虚拟机字节码指令的地址,字节码解释器就是通过改变程序计数器的值来获得下一条需要执行的字节码指令,内存空间小,是线程私有的。
虚拟机栈:线程私有的,生命周期和线程一样,描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至调用结束,就对应着一个栈帧从虚拟机中入栈到出栈的过程
局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)
本地方法栈:区别于虚拟机栈,java虚拟机栈是为了java方法服务的,本地方法栈是为了虚拟机需要使用到的native方法服务的。
堆: 是线程共享的部分,用来存储对象实例和数组,
方法区:属于共享内存区域,用来存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等
虚拟机栈,程序计数器,本地方法栈这三个内存区域都是随线程共生的,栈帧中的栈随方法的进入和退出而执行着入栈和出栈的操作。而堆和方法区则不一样,属于是线程共享的,一个接口可能有多个实现类,并且每个实现类需要的内存也是不一样的,只有在程序运行的时候才知道具体需要创建哪一个实现类(与运行时类型),这部分的内存的分配和回收都是动态的,由垃圾回收器(GC)负责。
类加载器:
类加载器负责把class字节码文件加载到内存当中,并且将这些内容转换到方法区中,类加载器只负责将class字节码文件的加载,不负责运行,至于是否可以运行,由执行引擎来决定。
类加载器的分类:(三种+用户自定义)
1.启动类加载器 Bootstrap class loader(c++)
2.扩展类加载器 Extension class loader(java)
3.应用程序类加载器 App class loader
用户自定义类加载器(实现java.lang.ClassLoad实现)这是一个抽象类
双亲委派机制:当一个类加载器需要加载一个类的时候,不会自己去尝试加载这个类。而是先委托父级类加载器去加载,然后收到委托的类加载器也会遵循这个规则,先去委托自己的父级类加载去尝试加载这个类。最后都会委托到启动类加载。当父级类加载器中没有找到所需要的类的时候,子类才会尝试自己去加载。
双亲委派机制的好处是:沙箱安全机制,能够保证相同的类加载的都是同一个对象。