C#和java几乎一样,但是C#更安全
HotSpot含有两个即时编译器,一个是编译耗时短但输出代码优化程度较低的客户端编译
器(简称为C1)以及编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2),通常它们
会在分层编译机制下与解释器互相配合来共同构成HotSpot虚拟机的执行子系统。Graal编译器是以C2编译器替代者的身份登场的。C2维护太过复杂
Graal的优势
Graal能够做比C2更加复杂的优化,如“部分逃逸分析”(Partial
Escape Analysis),也拥有比C2更容易使用激进预测性优化(Aggressive Speculative Optimization)的
策略,支持自定义的预测性假设等
【重点面试区】
分为哪些部分,哪些是线程共享,哪些是线程隔离,都要记下来。
方法区:类第一次使用从磁盘进入内存先进入方法区。
虚拟机栈:方法的执行创建线程,变量句柄等等放在栈里面
堆:创建对象在堆中,创建进程在虚拟机栈中。
本地方法栈:java的最终执行还是要翻译成操作系统自带的一些方法,最终调用的还是操作系统的方法(操作系统的内核,操作系统的方法)
计数器:虚拟机进入线程的时候记录什么时候入栈,什么时候出栈,由计数器进行记录。
线程共享:
多个线程可以调用一个“方法区”;包含:方法区,堆,执行引擎,本地库接口
线程隔离:
同样一个数据,不同的线程不能访问,A线程访问某个信息的时候,B,C线程不能访问;包含:虚拟机栈,本地方法栈,程序计数器
程序计数器:
辅助线程栈,程序执行什么时候进入if,什么时候进入whtile,配合程序执行
java虚拟机栈:
是线程私有的,他的生命周期与线程相同;每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程;HotSpot虚拟机的栈容量是不可以动态扩展的;
ps:方法就是栈帧
栈帧:用于存储局部变量表、操作数栈、动态连接、方法出口等信息。
方法出口:出栈;动态连接:不同线程的方法被谁调用;
【面试题】
1.基本类型存在于哪儿?
在方法里面声明的,存在于栈中;在类中,在方法外声明的,被使用时,只能被new出来存在于堆中;静态的基本类型存在于方法区中。
2.两个异常
StackOverflowErroe:栈溢出,单个的栈空间满了,没办法入栈---递归的情况容易出现这种情况
OutOfMemoryError:内存溢出----内存不够了,就会溢出,指的是整个栈的内存,或者整个堆的内存
java堆:所有的对象实例以及数组都应当在堆上分配