- 1 jvm整体组成部分
类加载器, 运行时数据区, 执行引擎,本地库接口 - 2 类加载过程:
程序在运行之前会把java代码编译为字节码,jvm通过类加载器将其载入内存运行时数据区,字节码是jvm的一套指令集规范,所以底层操作系统不能直接执行,需要特殊的字节码解析器执行引擎将其翻译为底层系统指令交由cpu去执行,这一过程需要借助其他语言接口即本地库接口来实现。另外java所谓跨平台中平台指的是操作系统,java是jvm虚拟机字节码指令,因为jvm虚拟机是跨平台的,所以java会有平台无关的特性。
- 3 开发人员比较关注 运行时数据区,说下他的组成
有5部分组成,分别为: 程序计数器,java虚拟机栈,本地方法栈,java堆,方法区
简单说下我的了解:程序计数器,java 虚拟机栈,本地方法栈都属于线程私有的内存,同线程的生命周期一致。java堆主要是用来存储对象的,占很大一块内存区域,以及方法区,垃圾回收主要也是针对这两个内存区域进行回收内存的。
-
程序计数器:占用的内存空间较小,然后可以把它看做当前线程执行字节码的行号指示器,在虚拟机的概念模型里,字节码解析器就是通过改变他的值来选取下一条要执行的字节码指令的。成为线程私有内存原因:jvm的多线程是通过线程轮流切换和分配处理器执行时间来实现的。任何时刻,一个处理器(或一个内核)只会执行一条线程中的指令,因此线程切换后能恢复到正确的执行位置,需要将程序器作为线程的私有内存。每个线程都有自己的程序计数器,各个线程的计数器互不影响,独立存储。分支,循环,跳转,异常处理,线程恢复等基础功能都需要通过计数器来实现。
-
java 虚拟机栈:java虚拟机栈描述的是执行方法的内存模型,方法在执行的同时会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息,方法从调用到完成,对应一个栈帧在java虚拟机栈中入栈到出栈的过程。
在java 虚拟机规范中,定义了两种异常:
1 如果线程请求的栈深度大于虚拟机允许的栈深度,会抛出statckoverflowerror
2 如果虚拟机是可扩展的,但扩展时无法申请到足够的内存,会抛出outofmemoryError。 -
本地方法栈
本地方法栈和虚拟机栈是一样的,真要说区别就是java虚拟机栈是为java方法服务的,本地方法栈是为虚拟机调用native方法服务的,在这个内存区域也会抛出上面两种堆栈异常。 -
java堆
java堆是内存中最大的一块内存区域,虚拟机启动的时候创建,主要是用来存放对象实例的,属于线程共享的内存资源,java虚拟机规范规定:所有的实例和数组都要在堆上分配,但随着JIT编译器的发展和逃逸分析技术的逐渐成熟,会有栈上分配和标量替换优化技术,导致不是所有的实例都分配在堆上。 -
方法区
不好意思,到这里还未吸收,不久会追加
参考《深入理解java虚拟机》