1. 程式人生 > >Java內存管理-程序運行過程(一)

Java內存管理-程序運行過程(一)

運行時 strong mac 進制 編譯 csdn ima 內部 運行

勿在流沙住高臺,出來混遲早要還的。

做一個積極的人

編碼、改bug、提升自己

我有一個樂園,面向編程,春暖花開!

相信在做Java開發的夥伴一定知道 JVM(Java Virtual Machine(Java虛擬機)!本系列會開啟對JVM相關的知識的探索和總結,讓我們一起踏入JVM的學習之旅中,去了解和發現更加精彩的Java世界! 正如奧古斯特·羅丹 說過:世界上不是缺少美,而是缺少發現美的眼睛。Java的世界也是如此!

本文地圖:

技術分享圖片

1、什麽是程序

在計算機領域當中,程序就是為了能夠讓計算機執行某種特定操作或者說解決某種問題,而進行的一些列的指令的集合。這些指令又是指令呢?

指令是由一種二進制數碼組成。一條指令通常也由兩部分就行組成:操作碼和地址碼。

  • 操作碼:操作碼就是我們要完成的操作是什麽樣的類型或者性質,比如說取數、做加減法、輸出數據等等。

  • 地址碼:操作的對象的內容或所在存儲單元的地址。

程序又是通過程序設計語言來實現的。在低級程序語言如機器語言、匯編語言中,程序是一組有序的指令序列及有關的數據;在高級程序語言中,如Java中,程序通常是一組說明和語句組成(數據結構+算法)。程序必須裝入計算機內部才能實際起作用。

2、解釋性語言和編譯型語言

學過Java的人一定有聽過這兩個名詞, 先說明一下Java是解釋型語言。

為什麽有這兩種程序的運行方式出現呢?

因為:計算機不能直接理解高級語言,只能直接理解機器語言(也即0101),所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。

翻譯的方式有兩種:

  • 一個是編譯

  • 一個是解釋。

這兩種程序方式只是翻譯的時間不同。

舉個例子:你現在JVM技術特別牛逼,受邀請去哈佛大學做一次主題演講,自然,這要求你有很好的英語水平,如果你很不幸,和我一樣,英語水平渣的一B,但是又不想放棄這次機會,你又如下兩個選擇:

  • 第一種方式: 帶一個優秀的翻譯夥伴,你演講的時候說一句話,翻譯夥伴幫你翻譯成英文。好處:你可以暢所欲言;缺點:會拖延你的演講時間。因為你說的每一句話,都必須等待翻譯完才能繼續。

  • 第二種方式:先將演講稿寫好,翻譯成英文。如 Hello,Good Morning(哈嘍,骨的貓寧)。好處:不會拖延你的演講時間,你演講也比較流暢、快速的進行;缺點:不能自由發揮,如你的演講本來是上午,改為下午了,你就不在使用Hello,Good Morning(哈嘍,骨的貓寧)了。

到這裏如果你還沒有看懂Java是屬於哪一種的話,請繼續往下看,學過c++/java 這類程序語言的夥伴肯定知道,這些程序最終都是依賴操作系統來執行的。

那麽,可以這樣理解,我們的程序就好像 ”漢語“ ,而操作系統只懂英語,為了讓操作系統能夠聽過我們程序說的話(執行程序),可以選擇第二種,在執行程序之前先編譯成和操作系統相關的代碼(漢語->英語),比如C/C++ 將cpp文件編譯成exe文件,然後由操作系統執行,也就是編譯執行。我們也可以選擇第一種,執行的時候加載一個編譯程序 ,動態的將源程序的每一行翻譯成操作系統能理解的代碼(漢語-> 翻譯->英語),這就是解釋執行。

編譯執行快,但不夠靈活,解釋執行慢,運行時候要翻譯程序(對於Java而言就是Java虛擬機),優點就是比較靈活。

JVM(Java虛擬機)就是充當了翻譯的角色,所以說java是解釋型語言。理解了上面這兩個概念之後,也就能夠理解為什麽說Java 是一個跨平臺的語言了。因為不同的操作系統上可以安裝不同的JVM,也就是我們的漢語(Java源程序) 通過翻譯 (JVM),可以翻譯成不同的語言,讓不同國家(不同的操作系統)的人聽懂。

也就實現了 一次編程就可以到處運行的這個夢想。

註: 在Java剛面世的時候因為其是解釋執行,性能是比較的慢,所以被C++等程序嘲笑,但是隨著發展現在性能已經大大提升,不差於編譯執行的程序了。努力終有發光的機會的。

3、程序的運行過程

在說Java程序運行的過程中,不得不說的三個組件: Java程序、Java虛擬機和操作系統。Java程序的運行是需要JVM的,JVM又要與操作系統交互獲取內存和釋放內存。這裏通過三個階段來說明一下之間的關系以及程序運行過程中內存分配是如何分配的。

java程序在的執行過程:

技術分享圖片

  • 程序運行前

有些編程語言編寫的程序會直接向操作系統請求內存,但 Java並不支持那麽做。當程序準備執行時,由 JVM 向操作系統請求一定的內存空間,稱為初始內存空間。程序執行過程中所需的內存都由 Java 虛擬機從這片內存空間中劃分。這樣做的一個重要優點是保證了程序的平臺無關性。

技術分享圖片

  • 程序運行中

Java 程序一直向 Java 虛擬機申請內存,當程序所需內存空間超出初始內存空間時,Java 虛擬機會再次向操作系統申請更多的內存供程序使用。

技術分享圖片

  • 程序運行內存溢出

程序接著運行,當 Java 虛擬機已申請的內存達到了規定的最大內存空間,但程序還需要更多的內存,這時會出現內存溢出的錯誤。

技術分享圖片

從上面的三個階段,可以看出程序是如何執行和分配內存的,Java程序所使用的內存是由 Java 虛擬機進行管理、分配的。Java 虛擬機規定了 Java 程序的初始內存空間和最大內存空間,開發者只需要關心 Java 虛擬機是如何管理內存空間的,而不用關心某一種操作系統是如何管理內存的。


謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!



不管做什麽,只要堅持下去就會看到不一樣!在路上,不卑不亢!

博客首頁 : http://blog.csdn.net/u010648555

願你我在人生的路上能都變成最好的自己,能夠成為一個獨擋一面的人
技術分享圖片

? 每天都在變得更好的阿飛雲

Java內存管理-程序運行過程(一)