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,OutOfMemoryError |
4 | Java堆 | 堆 是Java虚拟机里,管理内存最大的一块,在虚拟机启动时创建,用来存储所有的对象实例和数组,堆可以细分为新生代和老年代,再细致有Eden空 间,From Survivor空间和To Survivor空间,Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。 | 线程共享 | -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError最后一个可以打印dump信息 | OutOfMemoryError |
5 | 方法区 | 与Java堆一样,是线程共享区域,存储已经被加载过的类信息,常量,静态变量,即时编译后的代码等,此区域很少进行垃圾回收,一般习惯上称永久代(Permanent Generation) | 线程共享 | -XX:MaxPermSize设置上限,-XX:PermSize设置最小值,VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M | OutOfMemoryError |
6 | 运行时常量池 | 隶属于方法区,在Class文件中,除了有类的版本,字段,方法,接口等信息,还有一项信息就是常量池,用于存储编译生成的字面量和符号引用,这部分内容在类加载后进行方法区,常量池存放,运行时的常量池,比较多的是String.intern()方法 | 同方法区 | 同方法区 | OutOfMemoryError |
7 | 直接内存 | 直 接内存并不是虚拟机运行时的一部分,也不是JAVA虚拟机规范中定义的内存区域,但这部分内存也频繁被使用,在JDK1.4之后,加入了NIO,引入了一 种基于通常(Channel)和缓冲区(Buffer)的IO方式,可以直接使用Native函数,直接分配堆外内存,然后通过一个存储在Java堆中的 DirectByteBuffer对象,作为这块内存的引用,进行操作,这样能在一些场景显著提高性能 | 线程共享 | -XX:MaxDirectMemorySize设置最大值,默认与java堆最大值一样。例:-XX:MaxDirectMemorySize=10M -Xmx20M | OutOfMemoryError |
相关推荐
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理程序运行时的内存。本文主要探讨JVM的类加载机制,包括类加载、连接、初始化等关键过程,以及类的主动使用和被动使用的情况。 首先,我们要理解...
**JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...
Java 虚拟机(JVM)自动内存管理机制是 Java 语言的一大特色,它使得 Java 程序员无需手动管理内存,从而提高了开发效率和程序稳定性。JVM 自动内存管理机制主要通过 JVM 的内存模型来实现,它将 JVM 的内存在运行时...
本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...
### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践第3版学习笔记
它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行...
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明 学习笔记
Java 虚拟机(JVM)是Java编程语言的核心组成部分,它允许Java代码在不同的操作系统上运行,实现了“一次编写,到处运行”的目标。JVM 是一个虚拟计算机,能够执行字节码(.class文件),这些字节码是Java源代码经过...
这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...
读书笔记:《深入理解Java虚拟机JVM高级特性与最佳实践第2版》学习笔记
### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...
在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与优化对分布式系统的性能、可扩展性和可靠性...
虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...
尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)学习笔记_NOTE_JVM
读书笔记:学习代码深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明
除了上述提到的基础知识点外,《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》这本书籍还深入探讨了JVM的性能调优、并发编程、以及各种高级特性的具体应用。比如,对于性能调优,书中讲解了如何根据不同的...
它的设计目标是实现“一次编写,到处运行”,通过Java虚拟机(JVM)确保代码在不同操作系统上都能运行。Java语言的特点包括简洁性、面向对象、健壮性、安全性、高效性和可移植性。 【基本语法】 Java的基本语法包括...
《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...