Java虚拟机之JVM整理学习笔记(一)
- 摘要:JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器,JVM屏蔽了JAVA和底层操作系统之间的复杂交互流程,从而大大简化了系统的复杂性。JVM通过抽象操作系统和CPU结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关,所以我们才称使用JAVA编写的程序或服务是跨平台的,这一点相对于微软的C#来说,不过前几日.NET阵营已经也开源了.NET服务架构,宣布支持了C#跨平台的特性
- 标签:笔记 学习 Java 虚拟机 JVM 学习笔记
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器,JVM屏蔽了JAVA和底层操作系统之间的复杂交互流程,从而大大简化了系统的复杂性。JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方 法、主机硬件、主机操作系统无关,所以我们才称使用JAVA编写的程序或服务是跨平台的,这一点相对于微软的C#来说,不过前几日.NET阵营已经也开源了.NET服务架构,宣布支持了C#跨平台的特性,而且也宣布了Visual Studio支持移动端安装和IOS的跨平台开发,具体的效果如何,散仙也不好揣测,好了,不扯淡了,在了解JVM之前,我们先了解下JVM和JRE,JDK之间的区别与联系.
1,JDK
JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包 含JVM。
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
(注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的)总的来说JDK是用于java程序的开发,而jre则 是只能运行class而没有编译的功能。
eclipse、idea等 其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你 选中jre路径就ok了。
2,JRE -- java runtime environment
JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 在JDK的安装目 录里你可以找到jre目录,里面有两个文件夹bin和lib,在 这里可以认为bin里的就是jvm,lib中则是jvm工 作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件 和jre一起打包发给朋友,这样你的朋友就 可以运行你写程序了。(jre里有运行.class的java.exe)
JRE 是 Sun 公司发布的一个更大的系统,它里面就有一个 JVM 。 JRE 就与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本。同 JVM 一起组成 JRE 的还有一些 API (如 awt , swing 等)。 JRE 是运行 Java 程序必不可少的。
JRE ( Java Runtime Environment ),是运行 Java 程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的 地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
JRE里面有一个 JVM , JRE 与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本,,同 JVM 一起组成 JRE 的还有 一些 API (如 awt , swing 等), JRE 是 运行 Java 程序必不可少的.
3,JVM -- java virtual machine
JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。
JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行 时操作不同的内存区域。 JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方 法、主机硬件、主机操作系统无关。但是在一些小的方面, JVM 的实现也是互不相同的,比如垃圾回收 算法,线程调度算法(可能不同 OS 有不同的实现)。
下面,从图中看下JVM运行时的数据区结构
JVM的主要组成部分有七大部分:
序号数据区描述共享范围常用控制参数主要异常1程序计数器是一块较小的内存空间,是当先线程执行的字节码指示器,主要控制分支,循环,跳转,异常处理,线程恢复等基础功能,需呀依赖计数器完成线程私有JVM里唯一一个没有OutOfMemoryError情况的区域2虚拟机栈是方法执行的内存模型每个方法执行时都会创建一个栈帧用于存储局部变量表,动态链接,方法出口,每个方法的调用开发至结束就对应一个栈帧从入栈到出栈的过程,局部变量表存储了各种基本数据类型以及引用类型的指针线程私有-Xss128k,设置栈大小(1)如果请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常(2)如果虚拟机栈动态扩展时,无法申请到足够的内存,就会抛出OutOfMemoryError异常3本地方法栈与虚拟机栈的作用非常类似,区别仅在于虚拟机栈为JAVA服务,执行java方法,本地方法栈为虚拟机条用Native方法服务,有的虚拟机把二者直接合并为一个模块。线程私有-Xss128k,设置栈大小StackOverFlowError,OutOfMemoryError4Java堆堆是Java虚拟机里,管理内存最大的一块,在虚拟机启动时创建,用来存储所有的对象实例和数组,堆可以细分为新生代和老年代,再细致有Eden空间,From Survivor空间和To Survivor空间,Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。线程共享-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError最后一个可以打印dump信息OutOfMemoryError5方法区与Java堆一样,是线程共享区域,存储已经被加载过的类信息,常量,静态变量,即时编译后的代码等,此区域很少进行垃圾回收,一般习惯上称永久代(Permanent Generation)线程共享-XX:MaxPermSize设置上限,-XX:PermSize设置最小值,VM Args:-XX:PermSize=10M -XX:MaxPermSize=10MOutOfMemoryError6运行时常量池隶属于方法区,在Class文件中,除了有类的版本,字段,方法,接口等信息,还有一项信息就是常量池,用于存储编译生成的字面量和符号引用,这部分内容在类加载后进行方法区,常量池存放,运行时的常量池,比较多的是String.intern()方法同方法区同方法区OutOfMemoryError7直接内存直接内存并不是虚拟机运行时的一部分,也不是JAVA虚拟机规范中定义的内存区域,但这部分内存也频繁被使用,在JDK1.4之后,加入了NIO,引入了一种基于通常(Channel)和缓冲区(Buffer)的IO方式,可以直接使用Native函数,直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象,作为这块内存的引用,进行操作,这样能在一些场景显著提高性能线程共享-XX:MaxDirectMemorySize设置最大值,默认与java堆最大值一样。例:-XX:MaxDirectMemorySize=10M -Xmx20MOutOfMemoryError
- 大小: 171.1 KB