JVM初学笔记
2015-12-17 16:01
176 查看
JVM概念
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM屏蔽了与具体平台相关的信息,Java语言编译程序只需生成在Java虚拟机上运行的目标代码(.class字节码)即可,这就是java语言跨平台这一优点的由来。
JVM产品
目前主流的JVM有Oracle / Sun公司的HotSpot VM,JRockit VM,IBM的J9 VM。其中HotSpot 是绝对的主流,下文也是根据它做的分析。JDK,JRE,JVM之间的关系
JRE包含JVM和一些java API;JDK包含JRE和一些java开发工具和监控工具;
JVM结构
由上图可见,JVM有四个部分:类加载器子系统、运行时数据区域(内存空间)、执行引擎和本地方法接口。
其中:内存空间有五个部分:java堆、方法区、java栈、本地方法栈和程序计数器。
类加载器子系统(classloader)
负责把编译好的.class文件加载到内存(方法区)中。
执行引擎
JVM执行java字节码文件的核心。主要有四种执行方式:解释执行、编译执行、自适应优化执行和硬件芯片执行。
本地方法接口(JNI---java native interface)
JNI主要有两种使用场景:
a) 在方法中调用非java语言开发的
b) 在方法中用java直接操作硬件平台
本地方法的缺点:不方便而且不安全,也丢失了java的跨平台特性。
运行时数据区域(内存空间)
由上图可以看出,java堆和方法区是所有线程共享的,需要注意同步问题。java栈、本地方法栈和程序计数器都是线程私有的。
a) java堆:存储对象实例和数组值,通过new创建的对象实例都是存在这里的。
java堆主要分了两大部分:年轻代和老年代
年轻代:新创建的对象实例在伊甸园区(正如起名,繁衍新生之地)存储,如果空间不足了会把其中还存活的对象移动到两个幸存区(s0好s1是对称的,没有先后关系)
老年代:历经几次GC后还存活的对象会移至老年代
b) 方法区:
主要存储JVM加载的类信息,静态变量,final修饰的类、方法及变量。
方法区对应了JVM的持久代(PermanetGeneration)
c) java栈:
主要存储执行中java方法的参数、局部变量、操作数和中间结果等。
每个方法被执行时都会同时创建一个栈帧( Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息,每一个方法被调用直至执行完成的过程,
就对应着一个栈帧在java栈中从入到出栈的过程。
d) 本地方法栈
存储native方法调用的状态,用于本地方法的执行
e) 程序计数器
类似与CPU中的pc寄存器,用来存储指令地址(执行java方法时),如果执行的是本地方法,则值为Undefined。
JVM的生命周期
相关文章推荐
- Eclipse快捷键
- WordPress中查询文章的循环Loop结构及用法分析
- 在iTOP-4412开发板上调试helloworld应用
- Android studio 导入github工程
- Java Socket编程
- Linux IO实时监控iostat命令详解
- tableView:实现导航栏渐变和顶部禁止弹簧效果
- Linux IO实时监控iostat命令详解
- 居中对齐的一些总结
- “指定的SAS安装数据(sid)文件不能用于选定的SAS软件订单
- IOS 9 遇到的问题
- sql server 2008 对字段的操作
- UIImageView绕着某一个点旋转
- Xcode统计代码行数
- awk关联数组
- 最近为毛喜欢上C/C++语言了
- Google 的开源技术protobuf 简介与例子
- 算法学习:贪心求部分背包(使用结构体来求解)
- Python Network Programming(1)---设备名与IPv4地址
- 自定义类和类的实例化