JVM(Java虚拟机)简介(动力节点Java学院整理)
一、概要
1.Java虚拟机(Jvm)是什么?
2.Java虚拟机是用来干什么的?
3.Java虚拟机它的体系结构是什么样子的?
4.Java虚拟机在工作做扮演什么角色?
5.Java虚拟机在运行时数据区?
二、Jvm基础概念
Java虚拟机(Jvm)是可运行Java代码的假想计算机。
Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
在了解Jvm之前,大家如果有兴趣的,也可以先去了解下Java 中的堆和栈。
三、Jvm
我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,也就是前面所有的Java虚拟机中的字节码指令
集,编译成特定机器上的机器码。
如下:
1.Java源文件—->编译器—->字节码文件
2.字节码文件—->Jvm—->机器码
每一种平台的解释器是不同的,但是实现的虚拟机是相同的。这也就是Java为什么能够跨平台的原因了。当开始运行一个程序,这时虚拟机就开始实例化了。多个程序启动就会存在多个虚拟机实例。程序退出或者关闭。则虚拟机实例消亡。多个虚拟机实例之间数据不能共享。
四、Jvm的体系结构
Jvm的体系结构入下图:
1、垃圾回收器
垃圾回收器(缩写为gc):顾名思义是负责回收内存中无用的对象,就是这些对象没有任何引用了,它就会被视为:垃圾,就会被清理掉。
2、类装载子系统
一听名字,大家就知道,肯定是用于操作我们编译好的.Class文件的系统,他作用如下:
1.定位和导入二进制class文件 ;
2.验证导入类的正确性 ;
3.为类分配初始化内存 ;
4.帮助解析符号引用;
3、执行引擎(Execution Engine)
执行包在装载类的方法中的指令,也就是方法
4、运行区数据
虚拟机内存或者Jvm内存,冲整个计算机内存中开辟一块内存存储Jvm需要用到的对象,变量等,运行区数据又分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器
五、Jvm运行时数据区
1.程序计数器
当前线程执行字节码的信号指示器,线程是私有的,它的生命周期和线程相同分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
2.虚拟机栈
Java虚拟机栈描述的是Java方法(区别于native的本地方法)执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动作链接、方法出口等信息。
线程私有,生命周期和线程相同,都有各个独立的计数器,各不影响。
每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
3.本地方法栈
和虚拟机方法栈差不多类似,但是本地方法栈是服务于虚拟机所使用到的Native方法服务
4.本地方法区:
只是执行Native 方法。如果这个区的内存不足也是会抛出StackOverflowError 和OutOfMemoryError 异常。
六、堆
堆这块区域是Jvm中最大的,应用的对象和数据都是存在这个区域。这块区域也是线程共享的。也是 gc 主要的回收区。其实这也就是大家听的比较多的:Java (gc)垃圾回收器。
相关推荐
-
Java JVM虚拟机运行机制
一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行. 下面看下Jvm的体系结构图: 二:解释型语言和编译型语言的联系与区别. 编译型语言是通过
-
Java虚拟机JVM性能优化(一):JVM知识总结
Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化.之后的文章会讲JVM性能优化,包括最新的JVM设计--支持当今高并发Java应用的性能和扩展. 如果你是一个开发人员,你肯定遇到过这样的特殊感觉,你突然灵光一现,所有的思路连接起来了,你能以一个新的视角来回想起你以前的想法.我个人很喜欢学习新知识带来的这种感觉.我已经有过很多次这样
-
Java虚拟机JVM性能优化(三):垃圾收集详解
Java平台的垃圾收集机制显著提高了开发者的效率,但是一个实现糟糕的垃圾收集器可能过多地消耗应用程序的资源.在Java虚拟机性能优化系列的第三部分,Eva Andreasson向Java初学者介绍了Java平台的内存模型和垃圾收集机制.她解释了为什么碎片化(而不是垃圾收集)是Java应用程序性能的主要问题所在,以及为什么分代垃圾收集和压缩是目前处理Java应用程序碎片化的主要办法(但不是最有新意的). 垃圾收集(GC)的目的是释放那些不再被任何活动对象引用的Java对象所占用的内存,它是Java
-
Java虚拟机JVM性能优化(二):编译器
本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容. 本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比.然后,在文章的最后介绍了几种常见的JVM优化方法,如死代码消除,代码嵌入以及循环体优化. Java最引以为豪的特性"平台独立性"正是源于Java编译器.软件开发人员尽其所能写出最好的java应用程序,紧接着后台运行的编译器产生高效的基于目标平台的可执行代
-
了解Java虚拟机JVM的基本结构及JVM的内存溢出方式
JVM内部结构图 Java虚拟机主要分为五个区域:方法区.堆.Java栈.PC寄存器.本地方法栈.下面 来看一些关于JVM结构的重要问题. 1.哪些区域是共享的?哪些是私有的? Java栈.本地方法栈.程序计数器是随用户线程的启动和结束而建立和销毁的, 每个线程都有独立的这些区域.而方法区.堆是被整个JVM进程中的所有线程共享的. 2.方法区保存什么?会被回收吗? 方法区不是只保存的方法信息和代码,同时在一块叫做运行时常量池的子区域还 保存了Class文件中常量表中的各种符号引用,以及翻译出来的
-
Java 虚拟机(JVM)之基本概念详解
1.类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间. 2.方法区:就是存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等.方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决条件. 3.Java堆:再java虚拟机启动的时候建立Java堆,它是java程序最主要的内存工作区域,几乎所有的对象实例都存放到Java堆中,堆空间是所有线程共享的.堆解决的是数据存储问题,即数据怎么放.放在哪儿. 4.直接内存:Java的NIO库允许Ja
-
JVM(Java虚拟机)简介(动力节点Java学院整理)
一.概要 1.Java虚拟机(Jvm)是什么? 2.Java虚拟机是用来干什么的? 3.Java虚拟机它的体系结构是什么样子的? 4.Java虚拟机在工作做扮演什么角色? 5.Java虚拟机在运行时数据区? 二.Jvm基础概念 Java虚拟机(Jvm)是可运行Java代码的假想计算机. Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. 在了解Jvm之前,大家如果有兴趣的,也可以先去了解下Java 中的堆和栈. 三.Jvm 我们都知道Java源文件,通过编译
-
Java语言简介(动力节点Java学院整理)
Java 简介 Java是由Sun Microsystems公司(现已被oracle公司收购)于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出,据oracle官方数据指数,目前全球已有上亿的系统是使用Java开发的. Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程
-
深入理解Java虚拟机_动力节点Java学院整理
什么是Java虚拟机 Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行. 这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理
-
Java基本数据类型(动力节点java学院整理)
1. 数据类型: 在Java源代码中,每个变量都必须声明一种类型(type).Java数据类型(type)可以分为两大类:基本类型(primitive types)和引用类型(reference types).primitive types 包括boolean类型以及数值类型(numeric types).numeric types又分为整型(integer types)和浮点型(floating-point type).整型有5种:byte short int long char(char本质
-
Java自定义异常_动力节点Java学院整理
废话不多说了,直接给大家贴代码了,具体代码如下所示: /*下面做了归纳总结,欢迎批评指正*/ /*自定义异常*/ class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(m
-
Java关键字finally_动力节点Java学院整理
1.如果执行了try块没有异常,则继续运行finally块中的语句,即使try块通过return,break,或者continue于最后的语句退出,finally中的语句也是会执行的. 总结: 不管是否出现异常,finally子句总是在块完成之前执行. 代码: import java.util.Scanner; public class DivideByTwo{ public static void main(String args[]){ Scanner in=new Scanner(Syst
-
Java枚举_动力节点Java学院整理
enum 的全称为 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu"; String FRI = "Fri"; String
-
Java内部类_动力节点Java学院整理
内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同.内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可以和
-
Java死锁_动力节点Java学院整理
死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java package com.bjpowernode.threads; public class ThreadDeadlock { public static void main(String[] args) throws InterruptedException {
-
Java正则表达式_动力节点Java学院整理
正则表达式是什么?用我的理解就是一个表达式.用来匹配,替换,判断字符串,之前业务就出现过判断返回值是否为邮箱.在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串
随机推荐
- JS 正则表达式的相关方法(正则学习笔记1)
- 让你的网站可编辑的实现js代码
- Vuex简单入门
- asp.net使用jQuery获取RadioButtonList成员选中内容和值示例
- 浅谈对yield的初步理解
- PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
- PHP常见错误提示含义解释(实用!值得收藏)
- PowerShell中字符串分行显示的两种方法技巧
- vbs实现计算机重启
- windows2003 DNS服务器配置(图文详解)
- 判断一个对象是否为jquery对象的方法
- jQuery :nth-child前有无空格的区别分析
- Javascript别踩白块儿(钢琴块儿)小游戏实现代码
- C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法
- Android SlidingMenu使用和示例详解
- Android单片机与蓝牙模块通信实例代码
- 路由器端QQ封堵方案
- Node.js Express安装与使用教程
- Oracle分组函数之ROLLUP的基本用法
- Vue2.0生命周期的理解