成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這是一篇給Java初學(xué)者看的JVM文章

開發(fā) 前端
1. Java語言編寫的程序會(huì)被編譯為Java字節(jié)碼,也就是JVM自身的指令。運(yùn)行時(shí),JVM會(huì)將指令轉(zhuǎn)換成本地機(jī)器指令,從而實(shí)現(xiàn)跨平臺(tái)。

前言

很多Java開發(fā)人員,還不清楚JVM是什么,就直接涉足JVM調(diào)優(yōu)。

很多Java開發(fā)人員,說起JVM,只知道運(yùn)行時(shí)數(shù)據(jù)區(qū)域(或稱之為JVM內(nèi)存布局或JVM內(nèi)存結(jié)構(gòu))。

還有很多Java開發(fā)人員,在被問起:“你知道Java內(nèi)存模型嗎?”,答:“知道,Java內(nèi)存模型分為方法區(qū)、堆、...”。

......

雖說“概念”這個(gè)詞發(fā)明出來是為了方便交流和說明問題的,不用太過于較真。但是,答非所問就是你的不對(duì)了。

如果你屬于其中一者,我勸你看完這篇文章。

本文就一個(gè)目的:認(rèn)識(shí)JVM。

從 Java 的跨平臺(tái)特性說起

認(rèn)識(shí)JVM應(yīng)該從哪里入手?

可以問自己幾個(gè)問題,為什么有JVM?沒有JVM會(huì)怎樣?

Java編程語言設(shè)計(jì)的初衷就是要解決一個(gè)問題:程序員編寫一次程序,可以在任何提供Java運(yùn)行時(shí)環(huán)境的機(jī)器上運(yùn)行。

也就是Java語言的跨平臺(tái)特性“一次編寫,到處運(yùn)行”。

這一點(diǎn)可以在官方提供的文檔里證實(shí):

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html

可能有些Java開發(fā)人員對(duì)跨平臺(tái)特性不是很理解:“不應(yīng)該就是編寫一次到處運(yùn)行嗎?”。

當(dāng)然不是,如果了解C、C++語言的,就知道,想要在不同平臺(tái)上運(yùn)行,需要分別編譯,甚至重新編寫。

當(dāng)然,這是所有編程語言都存在的問題。原因下面有說明。

那么,Java是如何解決的?

Java 跨平臺(tái)的實(shí)現(xiàn):JVM

Java之所以能實(shí)現(xiàn)跨平臺(tái),離不開JVM的支持。

下面對(duì)此展開說明。

JVM 的定義

JVM,全稱:Java Virtual Machine (Java 虛擬機(jī))。

下面是官方對(duì)JVM的定義:

Java虛擬機(jī)是一種抽象的計(jì)算機(jī)。就像真正的計(jì)算機(jī)一樣,它有一個(gè)指令集,并在運(yùn)行時(shí)處理各種內(nèi)存區(qū)域。

這個(gè)說明已經(jīng)非常簡單明了了。如果不理解的繼續(xù)看下文。

跨平臺(tái)問題說明

任何一個(gè)高級(jí)編程語言編寫的程序,在最終執(zhí)行前,都會(huì)被翻譯成計(jì)算機(jī)可以理解的語言:機(jī)器碼,也就是諸如0101的二進(jìn)制數(shù)。

圖片圖片

這些機(jī)器碼就是指令的實(shí)際表示,計(jì)算機(jī)的工作原理就是通過執(zhí)行這些指令來完成具體的任務(wù)。

(每一條指令中明確規(guī)定了計(jì)算機(jī)從哪個(gè)地址取數(shù),進(jìn)行什么操作,然后送到什么地址去等步驟)

而同一個(gè)操作,在不同的平臺(tái),指令可能會(huì)有所不同。

例如,“將數(shù)據(jù)從內(nèi)存加載到寄存器”的操作,在x86架構(gòu)和ARM架構(gòu)中,指令就不一樣:

  • 在x86架構(gòu)中,可能會(huì)使用MOV指令將數(shù)據(jù)加載到寄存器EAX中:
MOV EAX, [0x12345678]
  • 在ARM架構(gòu)中,可能會(huì)使用LDR指令將數(shù)據(jù)加載到寄存器R0中:
LDR R0, [0x12345678]

所以,在一個(gè)平臺(tái)上編寫的程序要在其他平臺(tái)上運(yùn)行,就需要重新編譯,甚至重寫。否則就會(huì)出現(xiàn)下圖現(xiàn)象。

圖片圖片

這也正是跨平臺(tái)問題存在的根本原因。

從編碼到運(yùn)行

而JVM作為一個(gè)抽象的計(jì)算機(jī),對(duì)外提供了一套自己的指令集,作用何在?

JVM指令集作用是:在不同平臺(tái)運(yùn)行符合自己指令的程序時(shí),會(huì)將該指令轉(zhuǎn)換成當(dāng)前機(jī)器的本地指令。

這樣就避免了多次編譯的操作,從而實(shí)現(xiàn)“一次編寫,到處運(yùn)行”。

或者這樣理解:JVM替代了多次編譯的工作。

那么,“符合自己指令的程序”是什么呢?

沒錯(cuò),就是Java字節(jié)碼(class文件)。

我們平時(shí)在編寫完.java源碼后,會(huì)經(jīng)過JDK提供的編譯工具(javac)編譯為.class,而.class文件里面的內(nèi)容就是JVM指令。

圖片圖片

JVM 已成為規(guī)范

可能會(huì)有人有疑問,“為什么javac不直接編譯成機(jī)器碼?”

三個(gè)方面回答這個(gè)問題:

  1. 如果javac直接編譯成機(jī)器碼,就又回到跨平臺(tái)的問題了。
  2. JVM除了解決跨平臺(tái)問題外,還負(fù)責(zé)了內(nèi)存管理和安全性的問題。
  3. 發(fā)展至今,JVM已經(jīng)成為了一種規(guī)范,只要符合JVM規(guī)范,支持任何語言運(yùn)行在JVM上。

圖片圖片

JVM 的后續(xù)了解

通過上面的描述,如果理解了JVM是什么、JVM的作用或者JVM存在的意義,那就算是入門了。

如果激發(fā)了你對(duì)“JVM指令是什么”以及“它們?nèi)绾伪晦D(zhuǎn)換成機(jī)器指令”的好奇心,或者產(chǎn)生“類加載和JVM的關(guān)系”、“垃圾回收器和JVM的關(guān)系”等疑問。

那么,請(qǐng)關(guān)注我,后面的文章會(huì)帶你一起了解。或者,自己可以去官方進(jìn)行了解,官方文檔鏈接給你放在這。

Java 各版本文檔:

https://docs.oracle.com/en/java/javase/

Java語言&JVM規(guī)范文檔:

https://docs.oracle.com/javase/specs/index.html

總結(jié)

最后總結(jié)一下本文內(nèi)容:

  1. 所有高級(jí)編程語言編寫的程序最終要翻譯為機(jī)器碼(指令的實(shí)際表示)才能被計(jì)算機(jī)理解。
  2. 由于計(jì)算機(jī)的硬件架構(gòu)、操作系統(tǒng)不同,同一個(gè)操作指令可能也會(huì)不同。所以,程序要想在不同平臺(tái)上運(yùn)行,需要重新翻譯或編寫。
  3. Java最初是為了解決程序跨平臺(tái)運(yùn)行的問題,JVM正是實(shí)現(xiàn)跨平臺(tái)特性的關(guān)鍵所在。
  4. Java語言編寫的程序會(huì)被編譯為Java字節(jié)碼,也就是JVM自身的指令。運(yùn)行時(shí),JVM會(huì)將指令轉(zhuǎn)換成本地機(jī)器指令,從而實(shí)現(xiàn)跨平臺(tái)。
  5. JVM發(fā)展至今,已然是一個(gè)規(guī)范,已支持上百種編程語言。

當(dāng)了解了JVM的作用、存在的意義,再去了解JVM的工作原理就不會(huì)那么困惑了。

本文轉(zhuǎn)載自微信公眾號(hào)「Hi程序員」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Hi程序員公眾號(hào)。


責(zé)任編輯:武曉燕 來源: Hi程序員
相關(guān)推薦

2018-05-14 08:53:51

Linux命令shuf

2011-07-04 14:14:54

java

2011-04-12 10:13:24

2015-09-28 11:15:03

java初學(xué)者建議

2016-11-11 20:33:53

Hadoop大數(shù)據(jù)云計(jì)算

2019-12-13 16:19:15

戴爾

2018-01-29 13:41:06

數(shù)據(jù)庫區(qū)塊鏈比特幣

2016-11-18 17:40:35

2018-04-08 14:47:06

Linux命令type

2018-04-24 11:09:13

LinuxShellfc

2020-09-18 09:02:20

JavaScript

2020-09-08 19:03:41

Java代碼初學(xué)者

2020-07-29 08:26:40

Webpack前端模塊

2009-02-18 11:10:40

c++忠告方法

2011-04-08 15:07:40

C++

2013-12-12 10:20:00

JavaScript學(xué)習(xí)

2022-06-15 15:30:29

Linux新用戶建議

2009-06-23 13:32:48

JavaScript初竅門

2015-05-11 13:37:38

OracleOracle初學(xué)者

2009-11-03 17:35:43

ADO.NET對(duì)象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 不卡一区二区三区四区 | 久久精品国产清自在天天线 | 一区二区三区中文字幕 | 九九综合 | 久久成人高清视频 | 色婷婷综合久久久久中文一区二区 | 国产亚洲精品久久情网 | 99免费在线视频 | 国产精品九九视频 | 欧美精品在线播放 | 粉嫩av久久一区二区三区 | 久久91av| 久久亚洲一区二区 | 久久久久久国产精品免费免费狐狸 | 亚洲综合热 | 欧美国产日韩一区二区三区 | 成人影院在线视频 | 成人久久久久久久久 | 欧美一区免费 | 久草网站 | 亚洲精品一区二区网址 | 国产毛片久久久久久久久春天 | 日韩免费 | 日本特黄a级高清免费大片 国产精品久久性 | 一级黄色片网址 | 91成人在线 | 国产精品视频网 | 91av久久久| 性色网站| 99久久国产综合精品麻豆 | 日本小电影在线 | 男人天堂网av | 91最新视频| 一级a性色生活片久久毛片波多野 | 久久国产一区二区三区 | 久久久久久九九九九九九 | 蜜桃视频在线观看免费视频网站www | 天堂av免费观看 | 欧美在线天堂 | 黄色毛片一级 | 欧美一区二区大片 |