1.虚拟栈中栈帧的操作数栈是什么?
以字长为单位的数组,通过弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。
2.虚拟机栈中栈帧的动态链接是什么?
符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接。
第一次运行的时候,发现指令没有被解析,去CLASS文件中把常量池中有关系的信息(符号引用)找出来,之后根据这些信息去对应类的方法表里寻找对应的方法,得到方法表的偏移量(指针),这个偏移量(指针)就是“直接引用”,再将偏移量替换原来符号引用。简单来讲就是:符号引用就是先有一个标签。第一次运行后将这个标签替换为一个可以直接找到方法具体内存位置的具体值,利用这个具体值可以直接将被调用的方法直接放到虚拟机栈内存。
3.静态链接和动态链接的区别?
静态链接的优点:
1、程序的启动速度和运行速度相对于动态链接快。
静态链接的缺点:
1、内存和磁盘空间的浪费
当多个进程静态链接同一个静态库时,会复制多个副本,每个程序链接静态库的时候都会链接一个副本到目标文件里,链接的进程越多,副本也就越多,在磁盘上占用的空间就会变大,程序运行的时候,也会占用内存。
2、模块更新麻烦
有一个功能模块需要修改bug,需要整个项目程序进行重新编译后,再发布给客户升级,升级文件的容量非常大,客户获取程序、升级程序就非常不便。
动态链接的优点:
1、节省磁盘和内存
与静态链接不同,多个进程动态链接同一个动态库时,不需要把动态库链接到目标文件里,但会程序运行是需要依赖动态库,在磁盘空间不会造成浪费。在内存上,也是共享一份,可以节省内存。
2、模块更新速度快
程序发布出去后,如果某个模块需要更新,大部分情况下只需要编译该模块,不需要编译整个工程。客户只需要获取该模块并升级就可以,非常方便。
3、有利于程序的拓展性
动态链接可以再程序运行的时候可以动态地选择加载各个程序模块,实现程序功能的拓展。
动态链接的缺点:
动态链接会比静态链接运行的速度相对会慢一些。
4.为什么使用元空间替换永久代?
表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。
当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。
更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。

474

被折叠的 条评论
为什么被折叠?



