當前位置:首頁 » 編程軟體 » jvm編程

jvm編程

發布時間: 2024-01-23 00:26:33

『壹』 學編程到底是學C語言、C++、VB、jave中的哪種比較好

我的回答完全針對LZ的問題:
編程是不分語言的,數據結構和演算法思想跟語言無關。如果是初學者,建議從C學起,因為C語言是一門面向過程的語言,當然C比較難學,安全性也不是很好,但是C語言一旦學習到一定層次,學習其他語言就能很快上手。有了C的基礎,C++就能夠很快地掌握了。關於黑客和大型軟體項目的問題,C語言並不是一門好的開發大型項目的語言,因為語言本身是面向過程的,開發效率不高。C++則非常適合開發大型項目,它的封裝性和面向對象特性完全是面向大型項目的。當初把C升級為C++也就是鑒於C的開發效率不高這一點。如果LZ想學黑客這種東西的話,隨便去問問有經驗的人,他都會讓你從windows編程學起,windows編程也主要是基於C和C++的。因此C和C++是我比較推薦的兩門語言。
C和C++都是需要花費很多心血才能學好的,大型軟體適合用C++開發,而一些面向硬體的編程則屬於C的天地。推薦用一些外國的經典,比如C++primer和the C++ programming language。
至於java,也是目前比較流行的語言,它的類其實和C++的STL有些類似。有了C或者C++的基礎,相信Java上手也很快。Java同樣應用非常廣泛,很有前途,如果不想學C++的話,學Java也可以。
總而言之學習語言很辛苦,任何一門語言都要付出艱苦努力。你看得越多,編的越多,對語言的理解也就越多。

『貳』 什麼是Java虛擬機為什麼Java被稱作是「平台無關的編程語言」

Java虛擬機可以理解為一個特殊的「操作系統」,只是它連接的不是硬體,而是一般的操作系統和java程序。
正是因為有這樣一層操作系統與程序之間的連接,Java程序就能在一台機子上編譯後到處都能運行——只要有對應不同系統的Java虛擬機就可以了。因此Java被稱為「平台無關」。

『叄』 java是什麼類型的編程語言

一、你可以說它是編譯型的。因為所有的Java代碼都是要編譯的,.java不經過編譯就什麼用都沒有。
二、你可以說它是解釋型的。因為java代碼編譯後不能直接運行,它是解釋運行在JVM上的,所以它是解釋運行的,那也就算是解釋的了。
三、但是,現在的JVM為了效率,都有一些JIT優化。它又會把.class的二進制代碼編譯為本地的代碼直接運行,所以,又是編譯的。
像C、C++ 他們經過一次編譯之後直接可以編譯成操作系統了解的類型,可以直接執行的 所以他們是編譯型的語言。沒有經過第二次的處理 而Java不一樣他首先由編譯器編譯成.class類型的文件,這個是java自己類型的文件 然後在通過虛擬機(JVM)從.class文件中讀一行解釋執行一行,所以他是解釋型的語言,而由於java對於多種不同的操作系統有不同的JVM所以 Java實現了真正意義上的跨平台!

『肆』 單片機可以用Java編程嗎

通常不這樣,一般都是用C或者C++寫驅動,或者application。
但是如果這個單片機已經有jvm部署在系統裡面,比如說freertos已經集成了一個jvm,那麼是可以的,事實上像寶馬公司的車載系統中就有java。

BMW採用OSGI作為其底層架構,很多人都認為基於java的系統低效,不可能用於汽車這樣的應用控制系統上。這套系統主要用來控制汽車上的音箱、燈光等等設備,總共由1000多個Bundle構成,但BMW汽車的應用控制系統啟動時間卻只需要3.5秒,這也從很大程度上反應了採用OSGI的系統的效率並不會低。

『伍』 Java JVM怎麼學習啊從哪方面入手

一、 JVM的生命周期
1. JVM實例對應了一個獨立運行的java程序它是進程級別
a) 啟動。啟動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class都可以作為JVM實例運行的起點
b) 運行。main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內部有兩種線程:守護線程和非守護線程,main()屬於非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創建的線程是守護線程
c) 消亡。當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出
2. JVM執行引擎實例則對應了屬於用戶運行程序的線程它是線程級別的

二、 JVM的體系結構


1. 類裝載器(ClassLoader)(用來裝載.class文件)
2. 執行引擎(執行位元組碼,或者執行本地方法)
3. 運行時數據區(方法區、堆、java棧、PC寄存器、本地方法棧)

三、 JVM類載入器
JVM整個類載入過程的步驟:
1. 裝載
裝載過程負責找到二進制位元組碼並載入至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的載入,同樣,也採用以上三個元素來標識一個被載入了的類:類名+
包名+ClassLoader實例ID。
2. 鏈接
鏈接過程負責對二進制位元組碼的格式進行校驗、初始化裝載類中的靜態變數以及解析類中調用的介面、類。
完成校驗後,JVM初始化類中的靜態變數,並將其值賦為默認值。
最後對類中的所有屬性、方法進行驗證,以確保其需要調用的屬性、方法存在,以及具備應的許可權(例如public、private域許可權等),會造成NoSuchMethodError、NoSuchFieldError等錯誤信息。
3. 初始化
初始化過程即為執行類中的靜態初始化代碼、構造器代碼以及靜態屬性的初始化,在四種情況下初始化過程會被觸發執行:
調用了new;
反射調用了類中的方法;
子類調用了初始化;
JVM啟動過程中指定的初始化類。

JVM類載入順序:
JVM兩種類裝載器包括:啟動類裝載器和用戶自定義類裝載器。
啟動類裝載器是JVM實現的一部分;
用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。
JVM裝載順序:
Jvm啟動時,由Bootstrap向User-Defined方向載入類;
應用進行ClassLoader時,由User-Defined向Bootstrap方向查找並載入類;
1. Bootstrap ClassLoader
這是JVM的根ClassLoader,它是用C++實現的,JVM啟動時初始化此ClassLoader,並由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的實現)中所有class文件的載入,這個jar中包含了java規范定義的所有介面以及實現。
2. Extension ClassLoader
JVM用此classloader來載入擴展功能的一些jar包。
3. System ClassLoader
JVM用此classloader來載入啟動參數中指定的Classpath中的jar包以及目錄,在Sun JDK中ClassLoader對應的類名為AppClassLoader。
4. User-Defined ClassLoader
User-DefinedClassLoader是Java開發人員繼承ClassLoader抽象類自行實現的ClassLoader,基於自定義的ClassLoader可用於載入非Classpath中的jar以及目錄。

ClassLoader抽象類的幾個關鍵方法:
(1) loadClass
此方法負責載入指定名字的類,ClassLoader的實現方法為先從已經載入的類中尋找,如沒有則繼續從parent ClassLoader中尋找,如仍然沒找到,則從System ClassLoader中尋找,最後再調用findClass方法來尋找,如要改變類的載入順序,則可覆蓋此方法
(2) findLoadedClass
此方法負責從當前ClassLoader實例對象的緩存中尋找已載入的類,調用的為native的方法。
(3) findClass
此方法直接拋出ClassNotFoundException,因此需要通過覆蓋loadClass或此方法來以自定義的方式載入相應的類。
(4) findSystemClass
此方法負責從System ClassLoader中尋找類,如未找到,則繼續從Bootstrap ClassLoader中尋找,如仍然為找到,則返回null。
(5) defineClass
此方法負責將二進制的位元組碼轉換為Class對象
(6) resolveClass
此方法負責完成Class對象的鏈接,如已鏈接過,則會直接返回。

四、 JVM執行引擎
在執行方法時JVM提供了四種指令來執行:
(1)invokestatic:調用類的static方法
(2)invokevirtual:調用對象實例的方法
(3)invokeinterface:將屬性定義為介面來進行調用
(4)invokespecial:JVM對於初始化對象(Java構造器的方法為:<init>)以及調用對象實例中的私有方法時。

主要的執行技術有:
解釋,即時編譯,自適應優化、晶元級直接執行
(1)解釋屬於第一代JVM,
(2)即時編譯JIT屬於第二代JVM,
(3)自適應優化(目前Sun的HotspotJVM採用這種技術)則吸取第一代JVM和第二代
JVM的經驗,採用兩者結合的方式
開始對所有的代碼都採取解釋執行的方式,並監視代碼執行情況,然後對那些經常調用的方法啟動一個後台線程,將其編譯為本地代碼,並進行優化。若方法不再頻繁使用,則取消編譯過的代碼,仍對其進行解釋執行。

五、 JVM運行時數據區
第一塊:PC寄存器
PC寄存器是用於存儲每個線程下一步將執行的JVM指令,如該方法為native的,則PC寄存器中不存儲任何信息。
第二塊:JVM棧
JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的為當前線程中局部基本類型的變數(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址
第三塊:堆(Heap)
它是JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收。
(1) 堆是JVM中所有線程共享的,因此在其上進行對象內存的分配均需要進行加鎖,這也導致了new對象的開銷是比較大的
(2) Sun Hotspot JVM為了提升對象內存分配的效率,對於所創建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此JVM在給線程的對象分配內存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配
(3) TLAB僅作用於新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。
第四塊:方法區域(Method Area)
(1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。
(2)方法區域存放了所載入的類的信息(名稱、修飾符等)、類中的靜態變數、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class
對象中的getName、isInterface等方法來獲取信息時,這些數據都來源於方法區域,同時方法區域也是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。
第五塊:運行時常量池(Runtime Constant Pool)
存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區域中分配。
第六塊:本地方法堆棧(Native Method Stacks)
JVM採用本地方法堆棧來支持native方法的執行,此區域用於存儲每個native方法調用的狀態。

六、 JVM垃圾回收
GC的基本原理:將內存中不再被使用的對象進行回收,GC中用於回收的方法稱為收集器,由於GC需要消耗一些資源和時間,Java在對對象的生命周期特徵進行分析後,按照新生代、舊生代的方式來對對象進行收集,以盡可能的縮短GC對應用造成的暫停
(1)對新生代的對象的收集稱為minor GC;
(2)對舊生代的對象的收集稱為Full GC;
(3)程序中主動調用System.gc()強制執行的GC為Full GC。
不同的對象引用類型, GC會採用不同的方法進行回收,JVM對象的引用分為了四種類型:
(1)強引用:默認情況下,對象採用的均為強引用(這個對象的實例沒有其他對象引用,GC時才會被回收)
(2)軟引用:軟引用是Java中提供的一種比較適合於緩存場景的應用(只有在內存不夠用的情況下才會被GC)
(3)弱引用:在GC時一定會被GC回收
(4)虛引用:由於虛引用只是用來得知對象是否被GC

熱點內容
安卓動態庫反編譯 發布:2024-11-16 15:23:04 瀏覽:373
什麼是奧維伺服器lp地址 發布:2024-11-16 15:20:13 瀏覽:9
c數字圖像處理源碼 發布:2024-11-16 15:13:28 瀏覽:401
為什麼蘋果處理器一直比安卓好 發布:2024-11-16 15:13:22 瀏覽:152
折標演算法 發布:2024-11-16 15:07:10 瀏覽:474
如何做好編譯類節目 發布:2024-11-16 14:56:51 瀏覽:976
正版激活伺服器搭建 發布:2024-11-16 14:47:04 瀏覽:777
安卓導航cd怎麼用 發布:2024-11-16 14:37:06 瀏覽:801
mysql同步兩個資料庫 發布:2024-11-16 14:20:55 瀏覽:759
北京php培訓 發布:2024-11-16 14:20:39 瀏覽:495