JAVA-JVM-原理优化篇
JVM(Java Virtual Machine java虚拟机)
jvm的工作原理:
java语言最大的特点是可以跨平台操作,是因为java将写好的目标代码装载在一个叫JAVA虚拟机的平台上,这样恶意保证在不同平台上运行时,不需要再次编译代码。运行的代码其实是在JVM中,即代码不是直接运行在我们操作平台,所以JVM调优核心是如何让JAVA源代码在JVM中运行的效率最高。
影响JVM运行效率的核心指标是内存的使用,所以我们通常说JVM调试都是在谈论内存分配的问题。
Class Loader: 类的加载(加载 .class文件)。
JVM Memory: JVM的内存。
Method Area: 方法区。
Heap: 堆(内存,堆中分为三代,GC回收策略也是在堆中)。
JVM Language Stacks: 栈(java栈,存放的变量方法参数等,私有的)。
Native Method Stacks: 本地栈(本地的方法)。
PC Registers: PC计数器,存放私有的栈的寄存器,存放消耗的内存。
Execution Engine:执行引擎。
Native Method Interface:本地接口。
Native Method Libraries:本地库。
执行顺序: 先进行类的加载,然后存放到内存,调用执行引擎,执行引擎调用本地的接口,再调用本地的库。
堆和栈的区别:
JAVA源代码在运行过程中消耗很多内存,为了更好的、更充分的使用这些内存,在设计阶段会对程序所存储的位置进行分类。存储空间会分为两类:堆和栈。
在JAVA虚拟机中使用的数据又分为两类:一是基础数据,二是引用数据。
基础数据 通常包括:byte short int long char float boolean returnAddress。
引用类型 包括:接口,类,数组。
栈是运行单位,所以运行对象都存放在栈中,当程序运行时JVM会为每个线程分配一块栈空间,每个线程栈不是通用的,因为每个任务都有一个独立的线程来执行。堆时存储单位,所以有需要使用的数据都存放在堆中。堆是共享的。也就是堆是存放处理处理的地方,栈是用来处理逻辑的地方。之所以分堆与栈,这样的好处是可以将业务逻辑与数据进行分离,同时也可以提高数据的共享程度。
即:栈中存放的是引用类型,堆中存放的基础数据。
JVM的三代:
SUN、BEA、IBM: