第一章 走进Java
虚拟机一般指虚拟出来的电脑,Java虚拟机指虚拟出来的Java环境,也叫Java运行是占据的空间。
Java虚拟机家族:
虚拟机始祖:Sun Classic/Exact VM
武林盟主:HotSpot VM
小家碧玉:Mobile/Embedded VM
天下第二:BEA JRockit/IBM J9 VM
软硬合璧:BEA Liquid VM/Azul VM
挑战者:Apache Harmony/Google Android Dalvik
没有成功,但并非失败:Microsoft JVM及其他
新一代即时编译器:
自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器。
Graal编译器是以C2编译器替代者的身份登场的。
Graal编译器本身就是由Java语言写成,实现时又刻意与C2采用了同一种名为“Sea-of-Nodes”的高级中间表示(High IR)形式,使其能够更容易借鉴C2的优点。开发效率和扩展性上都要显著优于C2编译器。
自己编译JDK:
文件本质是比特数组(比特流),识别字符编码翻译成底层的C语言,并判断语言的正确性。
第二章 java内存区域与内存溢出异常
2.2 运行时数据区域
虚拟机栈:方法执行是在栈中创建线程栈,把方法压栈,变量的句柄也在栈中。
每个线程压入方法就是栈帧,java虚拟机栈也是线程私有的,它的生命周期
与线程相同。
单个线程栈空间不够:抛出StackOverflowError异常
整个栈、堆空间不够:抛出OutOfMemoryError异常
堆:在堆中创建对象。
对象实例在这里分配内存。//缓冲区:先申请足够大空间
本地方法栈:不管什么语言都要翻译成操作系统识别的语言,调用操作系统内核的方法。
程序计数器:虚拟机线程什么时候入栈,什么时候出栈,需要它来记录。
辅助线程栈,记录正在执行的指令的地址。
----------------------------------------------------
线程隔离:某一信息只属于一个线程。
*分为方法区、堆、虚拟机栈、本地方法栈、程序计数器五个部分,其中方法区和堆是线程共享的,其他是线程隔离的。
基本类型存在哪里?
方法中声明的存在栈中,类中(方法外)声明的存在堆中,静态的基本类型存放在方法区。