java虚拟机(一)
1、HotspotHotspot是交心的java虚拟机,用来代替JIT(Just in Time),可以大大提高java运行的性能Java原先把源代码便以为字节码在虚拟机执行,这样执行效率较慢,而Hotspot将常用的部分代码便以为本地(原生,native-)代码,这样显著提高了性能2、(1)程序计数器线程私有的内存空间,服务于线程的函数调用栈,可以存储一个字长大小的数据,从而实现类似...
1、Hotspot
Hotspot是交心的java虚拟机,用来代替JIT(Just in Time),可以大大提高java运行的性能
Java原先把源代码便以为字节码在虚拟机执行,这样执行效率较慢,而Hotspot将常用的部分代码便以为本地(原生,native-)代码,这样显著提高了性能
2、
(1)程序计数器
线程私有的内存空间,服务于线程的函数调用栈,可以存储一个字长大小的数据,从而实现类似硬件级的程序计数器
在虚拟机概念模型里,字节码解释器通过改变程序计数器的值,进而来选取下一条需要执行的字节码指令在内存中的地址,可以将它看做是当前线程所执行的字节码的行号指示器
(2)
jvm stack :虚拟机栈
每个线程都对应一个虚拟机栈,栈中存储的是将要执行的方法,方法进栈出栈等都是指的这个虚拟机栈,栈中存储的是栈帧,也就是方法
(3)
本地方法栈:执行的是native方法,执行的是c或者c++语言等)
(4)
(5)方法区
总结
第二部分:
1、虚拟机栈 (先进后出)
栈帧结构
栈帧结构详解
局部变量表:
1、一组变量值的存储空间,用于存放方法在执行过程中所需的参数和局部变量
2、局部变量表中的每个存储空间称为“变量槽” (Variable Slot) ,可存储的数据类型:byte ,short , int ,char, boolean,float, reference ,returnAddress(已过时)
总结上面的几种数据类型,发现他们的位数不超过32位,所以每个Slot的大小应该是32位
知识点补充一:九大基本类型数据
其中的八种不在说了,returnAddress:
returnAddress 类型会被 Java虚拟机的jsr、ret、合jsr_w指令所使用。、
returnAddress 类型的值指向一条虚拟机指令的操作码,与前面介绍的那些数值类的原生类型不同,returnAddress 类型在java语言之中并不存在相应的类型,也无法在程序运行期间更改returnAddress类型的值
通俗点讲就是,调用这个类型的变量就会跳转到下一个界面
操作数栈:
又称操作栈、表达式栈,是虚拟机的工作区
通过jvm字节码指令对“局部变量表”中的数据进行提取,调用,计算,存储等操作
操作数栈的深度由Code属性的max_stacks在编译器期确定
实例演示,栈帧的执行细节
该实例演示的是
public static void main(String[] args) {
int i = 10;
int j = 20;
int c = i+j;
}
执行步骤:
1、主方法进栈,将main方法的参数args添加到局部变量表
2、首先 将10压进操作数栈顶,其中bipush b 代表byte,意味着 10 是byte取值范围内的Int类型的数据
3、istore_1 将10 放到局部变量表的1位置
4、同样的步骤操作变量20,放到2位置
5、将局部变量表中的1位置和2位置的数加载到操作数栈
6、使用iadd 将操作数栈的两个变量相加然后放到局部变量表3位置
7、返回数据
面试题:
public class DayOne {
int age = 10;
public int test() {
try{
age = 20;
throw new NullPointerException();
}catch (Exception e){
age = 30;
return age;
}finally {
age = 40;
}
}
}
class DayTwo{
public static void main(String[] args) {
DayOne dayOne = new DayOne();
System.out.println(dayOne.test());
}
}
此题的输出结果是:30
是因为在栈帧中:
发现在第15行,将30压栈,然后放到了局部变量表中的0位置,然后又加载出来再2位置也放入了一份,返回的时候 也是返回的2位置上的数据,也就是说返回的是30
3、
其中符号引用的含义:
public class DayThree {
public void test(Runnable a){
a.run();
}
}
象上面的代码中是没有编译错误的,而Runnable对象没有具体的指向,此时就称为是一个符号引用
知识点二:
重写和重载的区别
重载: 1、必须具有 不同的参数列表(参数列表的不同,包含参数的个数,参数的类型)
2、可以有不同的返回值类型,只有参数的列表不同就可以了
3、可以有不同的访问修饰符
4、可以抛出不同的异常
重写: 1、参数列表必须完全与被重写的方法相同,方法名也要相同
2、返回的类型必须一直与被重写的 方法的返回值类型相同
3、访问修饰符的限制一定要大于被重写方法的访问修饰符
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查性异常
第三部分 垃圾回收机制算法
算法一:
算法二:
算法三:
算法四:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)