導航:首頁 > 編程語言 > java線程jvm

java線程jvm

發布時間:2022-10-17 05:51:11

1. java的多線程是OS調度還是JVM調度的呢

現在java線程和操作系統線程之間的對應關系有三種:
多對一、一對一、多對多

多對一就是所說的「Green thread」,一個java應用程序
被當作一個任務被操作系統調度,而這個java應用程序里
的多個線程則由虛擬機調度執行。也可以說由虛擬機選出
一個多線程java程序里的一個線程作為活動線程,這個線
程再作為操作系統的一個任務被操作系統調度。

一對一就是一個java線程對應一個操作系統線程了,即同
一個多線程java程序里的所有線程都由操作系統統一調度。

多對多還不是很明白。。。

2. java線程是由jvm控制的嗎

  1. -Xms 為jvm啟動時分配的內存,比如-Xms200m,表示分配200M

  2. -Xmx 為jvm運行過程中分配的最大內存,比如-Xms500m,表示jvm進程最多隻能夠佔用500M內存

  3. -Xss 為jvm啟動的每個線程分配的內存大小,默認JDK1.4中是256K,JDK1.5+中是1M

3. Java的多線程和CPU

CPU對於各個線程的調度是隨機的(分時調度),而在Java中,JVM負責線程的調度,可更好地分配CPU的使用權。對於線程的調度一般有兩種模式,分時調度和搶占式調度。分時調度是按照順序平均分配;搶占調度是按照優先順序來進行分配。

4. 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

5. java中學習線程應該怎麼去學習

打個比方,用戶注冊,如果用戶注冊有如下步驟

1:給用戶在資料庫中添加用戶信息

2:給用戶的手機號發送歡迎簡訊

3:系統中其它模塊和用戶關聯,需要同時添加其它的數據

這個時候,如果使用單線程,用戶提交注冊信息之後,系統拿到注冊信息,就要按照步驟1,2,3這么一步一步走下去,在這過程中,用戶只能等待,等到系統把這些步驟走完了,用戶才能得到響應,才能登陸系統,這個過程會很長,用戶體驗不好

但是如果使用多線程,在拿到用戶注冊信息之後,主進程把這些任務分給多個線程去做,每個線程做一件事,效率是不是提高了,時間是不是縮短了,並且,主線程可以把關鍵信息錄入系統之後就直接響應用戶,其它事情可以讓線程在後台慢慢執行,這樣用戶體驗就會好很多。

6. java多線程在jvm底層是通過什麼方式實現的

java虛擬機採用搶占式調度模型,是指優先讓可運行池中優先順序高的線程佔用CPU,如果可運行池中的線程優先順序相同,那麼就隨機選擇一個線程,使其佔用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU

7. java線程存放在jvm的哪個區域方法又存放在哪個區呢

聊到JAVA中的方法,大多數人對於方法存儲在方法區還是棧區(虛擬機棧)是很迷茫的。其實方法是存在方法區的下面我們就細細說一下JVM中的 方法區 VS 棧區方法區:用於存儲已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據,方法編譯出的位元組碼也是保存在這

8. 新建一個JAVA線程,佔用的是JAVA堆內存還是操作系統的內存

Thread對象本身是在堆內存創建的,調用start()後開辟的線程空間是屬於內存的。內存管理在Java語言中是JVM自動操作的,當JVM發現某些對象不再需要的時候,就會對該對象佔用的內存進行重分配(釋放)操作,而且使得分配出來的內存能夠提供給所需要的對象。

在一些編程語言裡面,內存管理是一個程序的職責,但是書寫過C++的程序員很清楚,如果該程序需要自己來書寫很有可能引起很嚴重的錯誤或者說不可預料的程序行為,最終大部分開發時間都花在了調試這種程序以及修復相關錯誤上。



相關信息

在以前的編程過程中,手動內存管理帶了計算機程序不可避免的錯誤,而且這種錯誤對計算機程序是毀滅性的,所以內存管理就成為了一個很重要的話題,但是針對大多數純面向對象語言而言,比如Java,提供了語言本身具有的內存特性。

自動化內存管理,這種語言提供了一個程序垃圾回收器(Garbage Collector[GC]),自動內存管理提供了一個抽象的介面以及更加可靠的代碼使得內存能夠在程序裡面進行合理的分配。最常見的情況就是垃圾回收器避免了懸掛引用的問題。

因為一旦這些對象沒有被任何引用「可達」的時候,也就是這些對象在JVM的內存池裡面成為了不可引用對象,該垃圾回收器會直接回收掉這些對象佔用的內存,當然這些對象必須滿足垃圾回收器回收的某些對象規則,而垃圾回收器在回收的時候會自動釋放掉這些內存。

閱讀全文

與java線程jvm相關的資料

熱點內容
浙江標准網路伺服器機櫃雲主機 瀏覽:587
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751
純前端項目怎麼部署到伺服器 瀏覽:538
瓜子臉程序員 瀏覽:505
如何保證伺服器優質 瀏覽:94
小微信aPP怎麼一下找不到了 瀏覽:299
演算法纂要學術價值 瀏覽:975
程序員你好是什麼意思 瀏覽:801
倩女幽魂老伺服器如何玩 瀏覽:561
電子鍾單片機課程設計實驗報告 瀏覽:999
看加密頻道 瀏覽:381
程序員算不算流水線工人 瀏覽:632
三星電視我的app怎麼卸載 瀏覽:44
簡述vi編譯器的基本操作 瀏覽:507
讓程序員選小號 瀏覽:91
加強數字貨幣國際信息編譯能力 瀏覽:584
購買的app會員怎麼退安卓手機 瀏覽:891
程序員的種類及名稱 瀏覽:293
美國程序員薪資 瀏覽:13