初识JVM

1. JVM简介

  • 初识JVM

  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

  从编译原理的角度来看,可以将编译过程按照“前端+后端”的方式进行划分。所谓的前端,就是指依赖源语言而与目标机无关,而后端则指依赖目标机而不依赖源语言。JVM的这种实现机制属于不同机器构造统一语言的编译程序的模式,即“同一前端+不同后端”;同样的道理,还有“不同前端+同一后端”,即同一机器生成不同语言的编译程序的模式,如.NET平台

  JVM是Java程序运行的容器,但是他同时也是操作系统的一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。一个运行时的JVM实例负责运行一个Java程序。当启动一个Java程序,则一个虚拟机实例也就诞生了,当程序关闭退出,虚拟机实例也就随之消亡,每个Java程序都运行于各自的虚拟机实例中。

  每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。类装载子系统除了要定位和导入二进制class文件外,还必须负责验证被导入类的正确性,为类变量分配并初始化内存,以及帮助解析符号引用。

  不容忽视的是运行时数据区又叫虚拟机内存或者Java内存,虚拟机运行时需要从整个计算机内存划分一块内存区域存储许多东西。例如:字节码、从已装载的class文件中得到的其他信息、程序创建的对象、传递给方法的参数,返回值、局部变量等等。Java虚拟机定义了若干种程序运行时所使用的运行时数据区,有些是随着Java虚拟机的启动而创建的,同时,随着虚拟机的关闭而销毁,而有些则是与线程一一对应。

  • 认识Java内存

  上面已经说到,运行时数据区即Java内存,根据存储数据的不同,Java内存通常被划分为5个区域:程序计数器(Program Count Register)、本地方法栈(Native Stack)、方法区(Methon Area)、栈(Stack)、堆(Heap)。下面针对每部分的功能进行简单介绍:

  程序计数器/PC寄存器:又叫程序寄存器。JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)。如果线程正在执行的是一个Java方法(非native),那么PC寄存器的值将总是指向下一条将被执行的指令,如果方法是 native的,程序计数器寄存器的值不会被定义。简单来说,程序寄存器可以看做当前线程所执行的字节码的信号指示器。

  栈:又叫堆栈。JVM为每个新创建的线程都分配一个栈。

  本地方法栈:存储本地方方法的调用状态。

  方法区:当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把这些类型信息(包括类信息、常量、静态变量等)放到方法区中。常量池存放在方法区中。

  堆:堆是Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域。在此区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存,但是这个对象的引用却是在栈中分配。因此,执行String s = new String(“s”)时,需要从两个地方分配内存:在堆中为String对象分配内存,在栈中为引用(这个堆对象的内存地址,即指针)分配内存。



  

  

  

时间: 2024-09-29 10:11:14

初识JVM的相关文章

初识JVM byte code

关于JVM和其上的byte code,网上其实有足够多的资料了,我这里就简单做个提纲和介绍,权当记录吧. stack-based VM Java byte code运行在JVM上,就像机器指令运行在物理机上,是需要遵循这个机器的指令规范的.所以认识JVM byte code,是需要稍微了解下JVM的.JVM是一个基于栈(stack-based)的虚拟机.很久以前我还写过类似简单的虚拟机. 基于栈的虚拟机其操作数和指令运算的中间结果全部都在一个虚拟栈中,与之对应的是基于寄存器(register-b

(二)初识JVM

Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(Java API).它们的关系如下图所示:  运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将其编译成字节码(.class文件),字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行. Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并

初识JVM堆栈

最近看到浅拷贝与深拷贝的区别.联想到了对象的存储形式,即堆内存. 故如下主要针对java虚拟机中的堆内存与栈内存做下简单学习: 堆内存也叫运行时内存,是程序运行期间动态占用的一块内存,也是jvm中主要关注的一块内存. 引申:堆溢出与栈溢出的区别?代码分别测试下. 提示-->由于堆内存存储的是对象,所以在程序运行期间如果能够无限创建对象或数组而未被GC及时回收,就可以导致堆内存溢出. 同理,一个方法内部,无限创建变量(入栈)即可导致栈内存溢出.如:递归调用. 原文地址:https://www.cn

1 初识JVM

原文地址:https://www.cnblogs.com/likevin/p/10183644.html

小仙女讲JVM(3)—垃圾收集机制 񪬗

原文: http://blog.gqylpy.com/gqy/445 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

JSON的学习与使用

.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > .katex-html { display: block; } .katex-display > .katex > .katex-html > .tag { position: absolute; right: 0px; } .katex { font: 1.21em / 1.2 KaTeX

JVM初识、调优

JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行java时,将他们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据,运行时数据包括java程序本身的数据信息和JVM运行java需要的额外的数据信息. JMM要理解 JVM运行时数据区 程序计数器--------线程私有 java虚拟机栈------线程私有 本地方法栈--------线程私有 Jav堆-------------线程公用 方法区------------线程公用 锁机制 JVM内存分配 1:栈内

JVM初识

JVM是Java编译器和OS之间的模拟处理器.代码程序面向虚拟机,只需生成虚拟机可以识别的代码,然后由解释器将其转换为特定系统的机器码执行. JVM提供的方式是操作系统的动态连接库,所以需要有程序路径path,path路径主要是用来寻找到程序运行所需要的类库. 虚拟机可理解的代码叫做字节码.字节码是JVM可以识别和执行的指令,它是一个二进制的类文件.JVM可以算是一个抽象的计算机,它具有一个指令集并可以使用不用的存储区域.它执行指令,还管理着数据.内存和寄存器.每个JVM都有方法区和堆被整个程序

JVM内存初识

内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存.Java虚拟机要运行程序,必须要对内存进行空间的分配和管理. Java虚拟机的内存划分 JVM的内存划分: 栈:存放的都是方法中的局部变量.方法的运行一定要在栈当中. 数组在内存中的存储 public class Demo04 { public static void main(String[] args) { int[] a