JVM笔记
java代码执行分为两部分:javac编译 java执行
代码并不是由上往下执行的,会经过编译期重排序进行优化,存在依赖关系的代码不会被重排序,保证了代码最终执行结果的正确性!
java虚拟机规范,运行时数据区通常包括:
程序计数器(Program Counter Register)
java栈(VM Stack)
本地方法栈(Native Method Stack)
方法区(Method Area)
堆(Heap)
* 不同的虚拟机厂商有不同的实现方式
程序计数器:
程序计数器是用来指示执行哪条指令的,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则会影响正常的执行顺序。
java栈
也就是我们常说的栈,函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配,栈内存中的数据,没有默认初始值,需要手动设置。
本地方法栈
本地方法栈和java栈的作用和原理非常相似,区别只不过是java栈是为执行java方法服务的,而本地方法栈则是为执行本地方法服务的
方法区
方法区在jvm中也是一个非常重要的区域,它与堆一样,是被线程共享的区域,在方法区中,存储了每个类的信息(包含类的名称,方法信息,字段信息)、静态变量、常量以及编译器编译后的代码等。
堆
堆内存用来存放new创建的对象,堆内存中的实体是用来封装数据的,这些数据都有默认初始值,堆内存中的实体不再被指向时 ,jvm会启动垃圾回收机制。
运行类过程:方法区找到方法--堆中实例化对象--调用栈(指向堆中实例)