Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种Web应用。同时,为了提高Java语言的性能和健壮性,还引入了如垃圾回收机制等新功能,通过这些改进让Java具有其独特的工作原理。

1.Java虚拟机

Java虚拟机(Java Virtual Machine,JVM)是软件模拟的计算机,它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼容地执行保存在.cla文件中的字节码。Java虚拟机的“机器码”保存在.cla文件中,有时也可以称之为字节码文件。

Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.cla文件。

Java虚拟机的建立需要针对不同的软硬件平台来实现,既要考虑处理器的型号,也要考虑操作系统的种类。由此在ARC结构、X86结构、MI和C等嵌入式处理芯片上,在UNIX、Linux、Windows和部分实时操作系统上都可实现Java虚拟机。

2.无用内存自动回收机制

在程序的执行过程中,部分内存在使用过后就处于废弃状态,如果不及时进行回收,很有可能会导致内存泄漏,进而引发系统崩溃。在C++语言中是由程序员进行内存回收的,程序员需要在编写程序时把不再使用的对象内存释放掉,这种人为管理内存释放的方法往往由于程序员的疏忽而致使内存无法回收,同时也增加了程序员的工作量。而在Java运行环境中,始终存在着一个系统级的线程,专门跟踪内存的使用情况,定期检测出不再使用的内存,并自动进行回收,避免了内存的泄露,也减轻了程序员的工作量。

3.代码安全性检查机制

安全和方便总是相对矛盾的。Java编程语言的出现使得客户端计算机可以方便地从网络上上传或下载Java程序到本地计算机上运行,但是如何保证该Java程序不携带病毒或者没有其他危险目的呢?为了确保Java程序执行的安全性,Java语言通过Alet程序来控制非法程序的安全性,也就是有了它才确保Java语言的生存。

Java字节码的执行需要经过以下3个步骤:

(1)由类装载器(cla loader)负责把类文件(.cla文件)加载到Java虚拟机中。在此过程需要检验该类文件是否符合类文件规范。

(2)字节码校验器(bytecode verifier)检查该类文件的代码中是否存在着某些非法操作,例如Alet程序中写本地计算机文件系统的操作。

(3)如果字节码校验器检验通过,由Java解释器负责把该类文件解释成为机器码进行执行。

注意:

Java虚拟机采用“沙箱”运行模式,即把Java程序的代码和数据都限制在一定内存空间里执行,不允许程序访问该内存空间以外的内存。如果是Alet程序,还不允许访问客户端机器的文件系统。

Java的运行环境

无论哪种语言都需要有它特定的运行环境,也就是平台。Java语言同样不例外。但是如何理解Java程序与硬件环境无关呢?

几乎所有的语言都需要通过编译或者解释才可以被计算机执行,但是Java有一点不同,它同时需要这两个过程。其实,也正是因为这个原因才使Java这种语言具有了平台无关性。当完成一个Java源程序后,首先,通过Java翻译程序将它编译成一种叫做字节码的中间代码,然后再由Java平台的解释器将它转换成为机器语言来执行,这一平台的核心就是JVM。

Java的编译过程与其他的语言不同。像C++这样的语言,在编译时它是与计算机的硬件平台信息密不可分的。编译程序通过查表将所有指令的操作数和操作码等转换成内存的偏移量,即程序运行时的内存分配方式,目的是保证程序正常运行。Java却是将指令转换成为一种.cla的文件,这种文件不包含硬件的信息,需要执行时只要经过安装有JVM的机器进行解释,创建内存分配后再通过查表来确定一条指令所在的地址。这样就有效地保证了Java的可移植性和安全性。

Java平台具有这样的特性和它的结构有关。通常一个程序运行的平台是一个硬件或者软件运行的环境,目前比较流行的是Windows XP、Linux、Solaris和MacOS。Java的平台不太一样,它由两个部分组成,即JVM和应用程序设计接口。

1.JVM

JVM是Java平台的核心,为了让编译产生的字节码能更好地解释与执行,因此把JVM分成了6个部分:JVM解释器、指令系统、寄存器、栈、存储区和碎片回收区

◆JVM解释器:即这个虚拟机处理字段码的CPU。

◆JVM指令系统:该系统与计算机很相似,一条指令由操作码和操作数两部分组成。操作码为8位二进制数,主要是为了说明一条指令的功能,操作数可以根据需要而定,JVM有多达256种不同的操作指令。

◆寄存器:JVM有自己的虚拟寄存器,这样就可以快速地与JVM的解释器进行数据交换。为了功能的需要,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)。

◆JVM栈:指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算所需要的信息。

◆存储区:JVM存储区用于存储编译过后的字节码等信息。

◆碎片回收区:JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收,这就使得开发人员免去了自己编程控制内存的麻烦和危险。随着JVM的不断升级,其碎片回收的技术和算法也更加合理。JVM 1.4.1版后产生了一种叫分代收集技术,简单来说就是利用对象在程序中生存的时间划分成代,以此为标准进行碎片回收。

2.Java应用程序设计接口

Java Alication Programming Interface简称Java API,其中文名为Java应用程序设计接口。它是一个软件集合,其中有许多开发时所需要的控件,可以用它来辅助开发

Java API和JVM构成了Java运行的基本环境,这两种软件整合在一起处于计算机之上,通过这两种软件,Java平台把一个Java应用程序从硬件系统分离开,从而很好地保证了程序的独立性。为了更好地适应开发的需要,Java的设计者们提供了3种版本的Java平台:Java 2 Micro Edition (J2ME )、Java 2 Standard Edition(J2SE)和 Java 2 Enterprise Edition (J2EE),每一种版本都提供了丰富的开发工具以适应不同的开发需要。

转载于:https://my.oschina.net/alphajay/blog/3799

深入探索Java工作原理:JVM,内存回收及其他相关推荐

  1. java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟

    java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...

  2. Java jvm 内存回收机制

    原文:Java jvm 内存回收机制 源代码下载地址:http://www.zuidaima.com/share/1782298898271232.htm 在Java中,它的内存管理包括两方面:内存分 ...

  3. 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. 深入理解Java虚拟机:jvm内存模型jdk1.8

    深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...

  5. 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer

    一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...

  6. 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题

    某个线上的应用运行几天后,总是出现卡死甚至出现OOM的情况. 注:文中图片可能与描述不符,仅作为演示! 通过Linux的top命令查看cpu占比 首先通过top命令查看,发现某个java程序占用了较高 ...

  7. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

  8. 【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )

    文章目录 一.Java VisualVM 工具安装 Visual GC 插件 二.使用 Java VisualVM 分析 GC 内存 一.Java VisualVM 工具安装 Visual GC 插件 ...

  9. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  10. Java学习日报—JVM垃圾回收全解—2021/11/26

    目录 1.1 确定垃圾对象 1.1.1 引用计数法 1.1.2 可达性分析法 1.2 引用 1.2.1 宣告对象死亡 1.3 方法区回收 1.3.1 回收废弃常量 1.3.2 回收无用的类 1.4 常 ...

最新文章

  1. 46 万奖金等你拿 | 微众银行第二届金融科技高校技术大赛报名中
  2. 北京学python去哪里好_北京想学习Python应该去哪里好
  3. 深度丨解密Python为什么能够风靡全宇宙
  4. 菜鸟教程中Java语法(Java教程+Java面向对象)
  5. 引路蜂地图API:Gis.Navigation包定义
  6. 机器学习之支持向量机算法(一)
  7. 一条ssh命令实现端口转发,实现跨机器直接访问
  8. SQLSERVER 恢复挂起
  9. 读《About Face 4 交互设计精髓》22
  10. 十款最好用的远程桌面工具
  11. 电容或电感的电压_用动画来解释电感和电容元件上电压电流超前滞后的关系
  12. CSS 实现元素固定宽高比
  13. 华为hana服务器型号齐全,华为宣布工业服务器通过SAP HANA认证
  14. 看板 工具_2019年14种最佳看板工具
  15. 一脸懵逼学习Hadoop-HA机制(以及HA机制的配置文件,测试)
  16. 教你用python画一个可爱皮卡丘!
  17. 喜欢的歌,老歌居多,呵呵,怀旧,改不了的毛病
  18. 台式机安装Windows11正式版(跳过TPM)
  19. 什么是五险一金,你懂吗?
  20. docker pull报错:Timeout exceeded while awaiting headers解决思路

热门文章

  1. 世界之窗浏览器 v 3.6.1.0 [官方最新版]
  2. [转贴]RUP与XP的平衡之道
  3. eclipse新建java项目_用eclipse创建Java项目(以一个初学者的角度全面教学)
  4. Android的异步多线程消息处理机制
  5. C#网络编程之---TCP协议的同步通信(相互发送接收数据)
  6. YAF 接口 2016-10-27
  7. git clone 失败_鲜为人知的Git功能——Git Worktree工作树
  8. Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license”
  9. BAT中删除目录,如何不显示删除的文件
  10. 喜庆访问量突破200万