国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JavaEE初階】了解JVM

這篇具有很好參考價(jià)值的文章主要介紹了【JavaEE初階】了解JVM。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一. JVM內(nèi)存區(qū)域劃分

JVM啟動(dòng)的時(shí)候,會(huì)申請(qǐng)到一整個(gè)很大的內(nèi)存區(qū)域.JVM是一個(gè)應(yīng)用程序,要從操作系統(tǒng)里申請(qǐng)內(nèi)存.JVM就根據(jù)需要,把空間分為幾個(gè)部分,每個(gè)部分各自有不同的功能.具體劃分如下:
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java

  • Native Method Stacks(本地方法棧):native表示是JVM內(nèi)部的C++代碼.就是給調(diào)用native方法(JVM內(nèi)部的方法)準(zhǔn)備的??臻g.

  • Program Counter Register(程序計(jì)數(shù)器):記錄當(dāng)前線程執(zhí)行到那個(gè)命令.(很小的一塊存一個(gè)地址)每個(gè)線程有一份.

  • JVM Stack(虛擬機(jī)棧):虛擬機(jī)棧是給Java代碼使用的棧. 此棧是JVM中一個(gè)特定的空間,對(duì)于 JVM虛擬機(jī)棧
    ,這里存儲(chǔ)的是方法之間的調(diào)用關(guān)系.整個(gè)??臻g內(nèi)部,可以認(rèn)為是包含很多個(gè)元素(每個(gè)元素表示一個(gè)方法),把這里的每個(gè)元素稱為**“棧幀”,這一個(gè)棧幀里,會(huì)包含這個(gè)方法的入口地址,方法的參數(shù),返回地址,局部變量等.
    而對(duì)于 本地方法棧 , 存儲(chǔ)的是
    native方法之間的調(diào)用關(guān)系**.
    虛擬機(jī)棧,不是只有一個(gè),而是有很多個(gè),每個(gè)線程都有一個(gè).
    【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
    由于函數(shù)調(diào)用,是有先進(jìn)后出特點(diǎn)的.此處的棧,也是先進(jìn)后出的.
    ??臻g整體一般都不會(huì)很大,但是每個(gè)棧幀其實(shí)占得空間比較小,一般代碼無限遞歸才會(huì)出現(xiàn)棧溢出情況.

  • Heap(堆):整個(gè)JVM空間最大的區(qū)域.new出來的對(duì)象,類的成員變量,都在堆上.**堆是一個(gè)進(jìn)程只有一份,棧是每個(gè)線程有一份.**一個(gè)進(jìn)程里有多個(gè)線程.所以一個(gè)進(jìn)程有多個(gè)棧.每個(gè)jvm就是一個(gè)java進(jìn)程.
    【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java

    注意這里的常見說法:棧是線程私有的.(此說法不完全對(duì)).私有的意思是我的你用不了.實(shí)際上,一個(gè)線程棧上的內(nèi)容,可以被另一個(gè)線程使用.比如通過變量捕獲,一個(gè)線程可以訪問到另一個(gè)線程的局部變量.

  • Metaspace(元數(shù)據(jù)區(qū)):即方法區(qū).一個(gè)進(jìn)程里只有一塊,多個(gè)線程共用一塊.

  • 【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
    小結(jié):

  • 局部變量 在 棧

  • 普通成員變量 在 堆

  • 靜態(tài)成員變量 在 方法區(qū)/元數(shù)據(jù)區(qū)

二. JVM類加載機(jī)制

2.1 類加載整體流程

類加載,準(zhǔn)確的說,類加載就是.class文件,從文件(硬盤)被加載到內(nèi)存中(元數(shù)據(jù)區(qū))這樣的過程.這個(gè)過程是非常復(fù)雜的.
.class文件可以有多個(gè)類對(duì)象
.class文件是編譯后的Java源代碼,它包含了編譯后的字節(jié)碼指令.
類加載主要分為以下幾個(gè)過程:
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java

  • 加載:把.class文件找到(找的過程),打開文件,地文件,把文件內(nèi)容讀到內(nèi)存中.

  • 驗(yàn)證:檢查.class文件格式是否正確. .class文件是一個(gè)二進(jìn)制文件,這里的格式是有嚴(yán)格說明的,官方提供了JVM虛擬機(jī)規(guī)范.規(guī)范文檔上描述了.class的格式:【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
    java代碼中寫的類的所有信息,都會(huì)包含在上述.class文件中.使用二進(jìn)制的方式重新組織.

  • 準(zhǔn)備:給類對(duì)象分配內(nèi)存空間(此時(shí)內(nèi)存初始化為全0)

  • 解析:針對(duì)字符串常量進(jìn)行初始化,把符號(hào)引用轉(zhuǎn)為直接引用.
    字符串常量,得有一塊內(nèi)存空間,存這個(gè)字符的實(shí)際內(nèi)容,還得有一個(gè)引用,用來保存這個(gè)內(nèi)存空間的起始地址.
    在類加載之前,字符串常量,此時(shí)是處在.class文件中的,此時(shí)這個(gè)"引用"記錄的并非是字符串常量的真正地址,而是它在文件中的"偏移量".(或者是占位符)(符號(hào)引用)
    類加載之后,才真正在把這個(gè)字符串常量放到內(nèi)存中,此時(shí)才有"內(nèi)存地址",這個(gè)引用才能被真正賦予成指定內(nèi)存地址.(直接引用)

    舉個(gè)??: 小學(xué)的時(shí)候,學(xué)校組織以班為單位大家看電影,
    但是到電影院之前我不知道自己的真實(shí)地址(真實(shí)座位),但是我知道我前面是A,后面是B,此時(shí)到了電影院,我們仨也是挨著的.(符號(hào)引用)
    此時(shí)我只知道自己的相對(duì)位置. 到了電影院之后,老師組織同學(xué)們坐下.我坐下之后才知道我們的真正位置.(直接引用)

  • 初始化:調(diào)用構(gòu)造方法,進(jìn)行成員初始化,執(zhí)行代碼塊,靜態(tài)代碼塊,加載父類.

2.2 類加載的時(shí)機(jī)

一個(gè)類,不是java程序已運(yùn)行,就把所有的類都加載了.而是真正使用的時(shí)候才加載(懶漢模式)
在以下場(chǎng)景中會(huì)觸發(fā)類加載:

  1. 構(gòu)造類的實(shí)例
  2. 調(diào)用這個(gè)類的靜態(tài)方法/使用靜態(tài)屬性
  3. 加載子類,就會(huì)先加載其父類

以上都是用到了再加載,一旦加載過后,后續(xù)使用就不用再加載.

2.3 雙親委派模型(經(jīng)典)

此過程發(fā)生在加載階段.
雙親委派模型:描述的是加載 找.class文件的基本過程.
JVM默認(rèn)提供了三個(gè)類加載器:

  • 啟動(dòng)類加載器(BootStrap ClassLoader):負(fù)責(zé)加載Java標(biāo)準(zhǔn)庫中的類(無論是哪種JVM的實(shí)現(xiàn),都會(huì)提供這些一樣的類)
  • 擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載JVM擴(kuò)展庫中的類.(由實(shí)現(xiàn)JVM的廠商/組織提供的額外功能)
  • 應(yīng)用程序類加載器(Application ClassLoader):負(fù)責(zé)加載項(xiàng)目中自己寫的類以及第三方庫中的.

【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
上述三個(gè)類,存在"父子關(guān)系"(不是父類子類,相當(dāng)于每個(gè)class loader有一個(gè)parent屬性,指向自己的父 類加載器).
那么上述類加載器如何配合工作呢?
首先加載一個(gè)類的時(shí)候,實(shí)現(xiàn)從ApplicationClassLoader開始.但是ApplicationClassLoader會(huì)把家在任務(wù)交給父親,讓父親去進(jìn)行.于是ExtensionClassLoader要去加載了,但是也不是真的加載,而是再委托給自己的父親.于是BootstrapClassLoader要去加載了,也是想委托給自己的父親,結(jié)果發(fā)現(xiàn),自己的父親是null. 沒有父親/父親加載完了,沒找著類,才由自己進(jìn)行加載,此時(shí)BootstrapClassLoader就會(huì)搜索自己負(fù)責(zé)的標(biāo)準(zhǔn)庫目錄的相關(guān)的類,如果找到就加載,如果沒找到,就繼續(xù)由子類加載器進(jìn)行加載.然后由ExtensionClassLoader真正搜索擴(kuò)展庫相關(guān)的目錄,如果找到了就加載,如果沒找到就由子類加載器進(jìn)行加載.然后由ApplicationClassLoader真正搜索用戶項(xiàng)目相關(guān)的目錄,如果找到就加載,如果沒找到就由子類加載器進(jìn)行加載(由于當(dāng)前沒有子了,只能拋出 類找不到這樣的異常)
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
那么為什么要有上述順序呢?
上述這套順序其實(shí)是出自于JVM實(shí)現(xiàn)代碼的邏輯,這段代碼大概是使用遞歸的方式寫的.但這個(gè)順序,最主要的目的就是為了保證Bootstrap能夠先加載,Application能夠后加載.這樣就可以避免說因?yàn)橛脩魟?chuàng)建了一些奇怪的類,引起不必要的bug.
假設(shè)用戶在自己的代碼中寫了個(gè)java.lang.String按照上述加載流程,此時(shí)JVM加載的還是標(biāo)準(zhǔn)庫的類,不會(huì)加載到用戶自己寫的這個(gè)類. 這樣就能保證,即使出現(xiàn)上述問題,也不會(huì)讓jvm已有代碼混亂,最多是用戶自己寫的類不生效.
另一方面,類加載器,其實(shí)是可以用戶自定義的.上述三個(gè)類加載器是jvm自帶的.用戶自定義的類加載器,也可以加入到上述流程中,就可以和現(xiàn)有的加載器配合使用,

三. JVM垃圾回收機(jī)制(GC)

垃圾:指的是不再使用的內(nèi)存空間.垃圾回收,就是把不用的內(nèi)存幫我們自動(dòng)釋放.
在執(zhí)行程序時(shí),要在堆上申請(qǐng)一塊內(nèi)存空間.在C/C++中,上述內(nèi)存空間需要手動(dòng)方式進(jìn)行釋放.如果不手動(dòng)釋放的話,這塊內(nèi)存的空間就會(huì)持續(xù)存在,一直存在到進(jìn)程結(jié)束(堆上的內(nèi)存生命周期比較長.不像棧,棧的空間會(huì)隨著方法執(zhí)行結(jié)束,棧幀銷毀而自動(dòng)釋放,堆則默認(rèn)不能自動(dòng)釋放.)那么這就可能會(huì)導(dǎo)致一個(gè)嚴(yán)重的問題—內(nèi)存泄漏.如果內(nèi)存一直占著不用,又不釋放,就會(huì)導(dǎo)致剩余空間越來越少.進(jìn)一步導(dǎo)致后續(xù)的內(nèi)存申請(qǐng)操作失敗.因此,大佬們想了一些辦法,來解決內(nèi)存泄漏的問題.
GC是其中最為主流的方式.(Java Go Python PHP JS大部分的主流語言都是使用GC解決內(nèi)存泄漏的問題的)

但GC中有一個(gè)比較關(guān)鍵的問題:STW問題(stop the world)
如果有時(shí)候,內(nèi)存中的垃圾已經(jīng)非常多了,此時(shí)觸發(fā)一次GC操作,開銷可能非常大,大到可能把系統(tǒng)資源吃了很多.另一方面GC回收垃圾的時(shí)候可能會(huì)涉及到一些鎖操作.導(dǎo)致業(yè)務(wù)代碼無法正常執(zhí)行.這樣的卡頓,極端情況下,可能是出現(xiàn)即使毫秒甚至上百毫秒.

JVM中有很多內(nèi)存區(qū)域:

  1. 程序計(jì)數(shù)器
  2. 元數(shù)據(jù)區(qū)

  3. GC主要是針對(duì)進(jìn)行釋放的.
    GC是以"對(duì)象"為基本單位,進(jìn)行回收的.而不是字節(jié)!
    【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
    GC回收的是整個(gè)對(duì)象都不再使用的情況.而一部分使用一部分不使用的對(duì)象,暫且不回收.

3.1 GC實(shí)際工作過程

  1. 找到垃圾/判定垃圾
  2. 再進(jìn)行對(duì)象的釋放

3.1.1 找到垃圾/判定垃圾

找到垃圾/判定垃圾的關(guān)鍵就是看到底有沒有"引用"指向它.如果一個(gè)對(duì)象,有引用指向它,就可能被使用到;如果一個(gè)對(duì)象,沒有引用指向了,就不會(huì)再被使用了.
具體如何知道對(duì)象是否有引用指向呢?

1. 引用計(jì)數(shù)(不是java的做法,Python/PHP)

給每個(gè)對(duì)象分配了一個(gè)計(jì)數(shù)器(整數(shù)).每次創(chuàng)建一個(gè)引用指向該對(duì)象,計(jì)數(shù)器就+1,每次該引用被銷毀,計(jì)數(shù)器就-1.

{
	Test t = new Test();//Test對(duì)象的引用計(jì)數(shù)1
	Test t2 = t;//t2也指向了t,引用計(jì)數(shù)2
	Test t3 = t;//引用計(jì)數(shù)就是3
}
//大括號(hào)結(jié)束,上述三個(gè)引用超出作用域失效.此時(shí)引用計(jì)數(shù)就是0了,此時(shí)new Test()對(duì)象就是垃圾了.

這個(gè)辦法簡單有效,但是java沒有采用.但是這個(gè)辦法也有一定的缺點(diǎn):
1. 內(nèi)存空間浪費(fèi)的多(利用率低)
每個(gè)對(duì)象都要分配一個(gè)計(jì)數(shù)器,如果按四個(gè)字節(jié)計(jì)算.代碼中的對(duì)象非常少就無所謂.但是如果對(duì)象特別多,占用的額外空間就會(huì)很多,尤其是每個(gè)對(duì)象都比較小的情 況.例如:一個(gè)對(duì)象體積1k,此時(shí)多4個(gè)字節(jié),無所謂.一個(gè)對(duì)象體積事4字節(jié),此時(shí)多4個(gè)字節(jié),相當(dāng)于體積擴(kuò)大一倍.
2. 存在循環(huán)引用的問題

class Test{
	Test t = null;
}
Test a = new Test();//1號(hào)對(duì)象,引用計(jì)數(shù)是1
Test b = new Test();//2號(hào)對(duì)象,引用計(jì)數(shù)是1
a.t = b;//a.t也指向2號(hào)對(duì)象了,2號(hào)對(duì)象的引用是2
b.t = a;//b.t也指向1號(hào)對(duì)象了,1號(hào)對(duì)象的引用是2

接下來,a和b引用銷毀,此時(shí)a和b計(jì)數(shù)-1,但引用計(jì)數(shù)結(jié)果還都是1,不能釋放資源,但實(shí)際這兩個(gè)對(duì)象已經(jīng)無法訪問了。python/php使用引用計(jì)數(shù),需要搭配其他機(jī)制來避免循環(huán)引用.
舉個(gè)??:
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java

2. 可達(dá)性分析(Java的做法)

把對(duì)象之間的引用關(guān)系理解成了一個(gè)樹形結(jié)構(gòu),從一些特殊的起點(diǎn)出發(fā),進(jìn)行遍歷,只要能遍歷訪問到的對(duì)象,就是"可達(dá)的",再把"不可達(dá)的"當(dāng)作垃圾即可.
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java

就像上述的二叉樹,root指向根節(jié)點(diǎn)a.
如果root.right.right = null ,此時(shí)就表示f不可達(dá)
如果root.right = null此時(shí)就表示c不可達(dá),f也不可達(dá)了。
可達(dá)性分析的關(guān)鍵要點(diǎn),進(jìn)行上述遍歷,需要有"起點(diǎn)"被稱為gcroots.以下常做為根起點(diǎn):

  1. 棧上的局部變量(每個(gè)棧的每個(gè)局部變量,都是起點(diǎn))
  2. 常量池中引用的對(duì)象
  3. 方法區(qū)中,靜態(tài)成員引用的對(duì)象

可達(dá)性分析,總的來所,就是從所有的gcroots的起點(diǎn)出發(fā),看看該對(duì)象里又通過引用能訪問那些對(duì)象,依次遍歷,把所有可以訪問的對(duì)象都給遍歷一遍(遍歷的同時(shí)把對(duì)象標(biāo)記成"可達(dá)"),剩下的遍歷不到的對(duì)象就是"不可達(dá)".

可達(dá)性分析的特點(diǎn):可達(dá)性分析克服了引用計(jì)數(shù)的兩個(gè)缺點(diǎn),但是也有自己的缺點(diǎn):

  1. 消耗的時(shí)間更多,因此某個(gè)對(duì)象成了垃圾,也不一定能第一時(shí)間發(fā)現(xiàn),因?yàn)閽呙璧倪^程,需要消耗時(shí)間
  2. 在進(jìn)行可達(dá)性分析的時(shí)候,依次遍歷,一旦這個(gè)過程中,當(dāng)前代碼中的對(duì)象引用關(guān)系發(fā)生了變化,這就會(huì)使情況變得更加復(fù)雜。比如,當(dāng)一個(gè)對(duì)象指向下一個(gè)對(duì)象,剛遍歷完這個(gè)對(duì)象,這個(gè)對(duì)象的引用變了。因此,我們?yōu)榱烁鼫?zhǔn)確的遍歷,需要讓其他的業(yè)務(wù)線程暫停工作(STW問題)。

3.1.2 清理垃圾

主要有三種基本做法:

1. 標(biāo)記清除

這種策略,就是直接把垃圾對(duì)象的內(nèi)存釋放,但是這個(gè)方式的缺點(diǎn)就是會(huì)產(chǎn)生內(nèi)存碎片.
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
我們從內(nèi)存中申請(qǐng)空間的時(shí)候,都是整塊的連續(xù)的空間,現(xiàn)在這里空閑的空間是離散的,獨(dú)立的空間,總的空間可能很大.假如總的空閑的空間可能超過了1G,但是你想申請(qǐng)500MB可能都不一定申請(qǐng)到。

2. 復(fù)制算法

為了解決內(nèi)存碎片的問題,又引入了復(fù)制算法.復(fù)制算法,是把整個(gè)內(nèi)存空間,分成兩半,一次只用一半.
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
現(xiàn)在將2和4標(biāo)記為垃圾,要釋放垃圾,復(fù)制算法會(huì)將左邊不需要釋放內(nèi)存的空間復(fù)制到右邊的空間中,然后整體釋放左邊空間的內(nèi)存.

復(fù)制算法,就是把"不是垃圾"的對(duì)象復(fù)制到另外一半,然后把整個(gè)空間刪除掉.
每次觸發(fā)復(fù)制算法,都是向另外─側(cè)進(jìn)行復(fù)制,內(nèi)存中的數(shù)據(jù)拷貝過去.

缺點(diǎn):

  1. 空間利用率低
  2. 如果要是垃圾少,有效對(duì)象多,復(fù)制成本就比較大了~~
3. 標(biāo)記整理

【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
這種方法,保證了空間利用率,同時(shí)也解決了內(nèi)存碎片問題
但是這種做法的缺點(diǎn):

  1. 效率不高如果要搬運(yùn)的空間比較大,此時(shí)開銷也很大
4. 分代回收

基于上述這些基本策略,搞了一個(gè)復(fù)合策略"分代回收"
把垃圾回收,分成不同的場(chǎng)景,有的場(chǎng)景有這個(gè)算法,有的場(chǎng)景有那個(gè),各展所長.

分代是怎么分的?
基于一個(gè)經(jīng)驗(yàn)規(guī)律:如果一個(gè)東西,存在的時(shí)間比較長了,那么大概率還會(huì)繼續(xù)的長時(shí)間持續(xù)存在下去.(要沒早就沒了,既然存在,肯定有點(diǎn)用)
規(guī)律不等于"定律",允許例外,針對(duì)大部分情況有效的.

上述規(guī)律,對(duì)于Java的對(duì)象也是有效的.(是有一系列的實(shí)驗(yàn)和論證過程)
java的對(duì)象要么就是生命周期特別短,要么就是特別長.根據(jù)生命周期的長短,分別使用不同的算法.
給對(duì)象引入一個(gè)概念,年齡.(單位不是年,而是熬過GC的輪次)(經(jīng)過了這一輪可達(dá)性分析的遍歷,發(fā)現(xiàn)這個(gè)對(duì)象還不是垃圾.這就是"熬過一輪GC") 年齡越大,這個(gè)對(duì)象存在的時(shí)間就越久.
【JavaEE初階】了解JVM,JavaEE初階,java-ee,jvm,java
剛new 出來的,年齡是0的對(duì)象,放到伊甸區(qū).(出自圣經(jīng),上帝在伊甸園造小人)
熬過一輪GC,對(duì)象就要被放到幸存區(qū)了.雖然看起來幸存區(qū)很小,伊甸區(qū)很大,一般夠放.
伊甸區(qū)到幸存區(qū),采用的是復(fù)制算法.

幸存區(qū)之后,也要周期性的接受GC的考驗(yàn).
如果變成垃圾,就要被釋放.如果不是垃圾,拷貝到另外一個(gè)幸存區(qū)(這倆幸存區(qū)同一時(shí)刻只用一個(gè)),在兩者之間來回拷貝(復(fù)制算法),由于幸存區(qū)體積不大, 此處的空間浪費(fèi)也能接受.如果這個(gè)對(duì)象已經(jīng)再兩個(gè)幸存區(qū)中來回拷貝很多次了這個(gè)時(shí)候就要進(jìn)入老年代了·

老年代都是年紀(jì)大的對(duì)象.生命周期普遍更長.針對(duì)老年代,也要周期性GC掃描,但是頻率更低了
如果老年代的對(duì)象是垃圾了,使用標(biāo)記整理的方式進(jìn)行釋放.文章來源地址http://www.zghlxwxcb.cn/news/detail-636711.html

到了這里,關(guān)于【JavaEE初階】了解JVM的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入JVM了解Java對(duì)象實(shí)例化過程

    深入JVM了解Java對(duì)象實(shí)例化過程

    new :最常見的方式、 Xxx 的靜態(tài)方法, XxxBuilder/XxxFactory 的靜態(tài)方法 Class的newInstance 方法:反射的方式,只能調(diào)用空參的構(gòu)造器,權(quán)限必須是public Constructor的newInstance(XXX) :反射的方式,可以調(diào)用空參、帶參的構(gòu)造器,權(quán)限沒有要求 使用 clone() :不調(diào)用任何的構(gòu)造器,要求當(dāng)

    2023年04月24日
    瀏覽(16)
  • “深入剖析JVM內(nèi)部機(jī)制:了解Java虛擬機(jī)的工作原理“

    標(biāo)題:深入剖析JVM內(nèi)部機(jī)制:了解Java虛擬機(jī)的工作原理 摘要:本文將深入剖析JVM內(nèi)部機(jī)制,詳細(xì)介紹Java虛擬機(jī)的工作原理。我們將探討JVM的組成部分、類加載過程、內(nèi)存管理、垃圾回收以及即時(shí)編譯等關(guān)鍵概念。此外,還將提供示例代碼來幫助讀者更好地理解JVM的內(nèi)部機(jī)制

    2024年02月11日
    瀏覽(29)
  • 【JAVAEE】JVM中垃圾回收機(jī)制 GC

    【JAVAEE】JVM中垃圾回收機(jī)制 GC

    ? 博主簡介:想進(jìn)大廠的打工人 博主主頁: @xyk: 所屬專欄:?JavaEE初階 ? 上篇文章我們講了java運(yùn)行時(shí)內(nèi)存的各個(gè)區(qū)域。 傳送門:【JavaEE】JVM的組成及類加載過程_xyk:的博客-CSDN博客 對(duì)于程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧這三部分區(qū)域而言,其生命周期與相關(guān)線程有關(guān),隨線

    2024年02月16日
    瀏覽(28)
  • 【JavaEE】JVM的組成及類加載過程

    【JavaEE】JVM的組成及類加載過程

    博主簡介:想進(jìn)大廠的打工人 博主主頁: @xyk: 所屬專欄:?JavaEE初階 ? 本文我們主要講解一下面試中常見的問題,如果想深入了解,請(qǐng)看一下《Java虛擬機(jī)規(guī)范》這本書 目錄 文章目錄 一、JVM簡介 二、JVM整體組成 2.1 運(yùn)行時(shí)數(shù)據(jù)區(qū)組成 2.2 小結(jié) 三、JVM類加載 3.1 類加載過程 四、

    2024年02月13日
    瀏覽(20)
  • 【Java EE 初階】文件操作

    【Java EE 初階】文件操作

    目錄 1.什么是文件? 1.在cmd中查看指定目錄的樹形結(jié)構(gòu)語法 2.文件路徑 從當(dāng)前目錄開始找到目標(biāo)程序(一個(gè)點(diǎn)) 返回到上一級(jí)目錄,再找目標(biāo)程序(兩個(gè)點(diǎn)) 2.Java中文件操作 1.File概述 1.屬性 2. 構(gòu)造方法 3.常用方法 ?代碼展示: 4.常用方法2 3.?文件內(nèi)容的讀寫---數(shù)據(jù)流 1.I

    2024年02月06日
    瀏覽(25)
  • JavaEE 初階篇-深入了解多線程等待與多線程狀態(tài)

    JavaEE 初階篇-深入了解多線程等待與多線程狀態(tài)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點(diǎn)贊??收藏?評(píng)論? 文章目錄 ? ? ? ? 1.0 線程等待 ? ? ? ? 1.1?線程等待 -?join() 方法 ? ? ? ? 1.1.1 main 線程中等待多個(gè)線程 ? ? ? ? 1.1.2 main 線程等待 t2?線程且t2?線程等待 t1?線程 ? ? ? ? 1.1.3 其他線程阻塞等待 main 線程

    2024年04月17日
    瀏覽(18)
  • JVM,關(guān)于JVM基礎(chǔ)的知識(shí),你確定不了解一下嗎?

    JVM,關(guān)于JVM基礎(chǔ)的知識(shí),你確定不了解一下嗎?

    目錄 一.JVM的概念 什么是JVM? 二.JVM的運(yùn)行流程 1.class文件如何被JVM加載并運(yùn)行 2.JVM運(yùn)行時(shí)數(shù)據(jù)包括哪些區(qū)域(M) 三.類加載的過程(M) 四.雙親委派模型 1.雙親委派模型分析 2.JAVA中有哪些類加載器(M) 五.垃圾回收機(jī)制 1.死亡對(duì)象的標(biāo)識(shí) ①引用計(jì)數(shù)算法 ②可達(dá)性分析算法

    2024年02月02日
    瀏覽(21)
  • 【Java EE初階十三】網(wǎng)絡(luò)初識(shí)

    【Java EE初階十三】網(wǎng)絡(luò)初識(shí)

    ? ? ? ? 網(wǎng)絡(luò)發(fā)展的幾個(gè)主要時(shí)期: ????????單機(jī)時(shí)代-局域網(wǎng)時(shí)代-廣域網(wǎng)時(shí)代-移動(dòng)互聯(lián)網(wǎng)時(shí)代 ????????隨著時(shí)代的發(fā)展,越來越需要計(jì)算機(jī)之間互相通信,共享軟件和數(shù)據(jù),即以多個(gè)計(jì)算機(jī)協(xié)同工作來完成 業(yè)務(wù),就有了網(wǎng)絡(luò)互連。 ????????網(wǎng)絡(luò)互連: 將多臺(tái)計(jì)

    2024年02月20日
    瀏覽(21)
  • 【Java EE初階十七】網(wǎng)絡(luò)原理(二)

    【Java EE初階十七】網(wǎng)絡(luò)原理(二)

    2.2.2 關(guān)于可靠傳輸 4.滑動(dòng)窗口 ? ? ? ? 前面的三個(gè)機(jī)制,都是在保證 tcp 的可靠性; ????????TCP 的可靠傳輸,是會(huì)影響傳輸?shù)男实?(多出了一些等待 ack 的時(shí)間,單位時(shí)間內(nèi)能傳輸?shù)臄?shù)據(jù)就少了); ????????滑動(dòng)窗口,就讓可靠傳輸對(duì)性能的影響,更少一些.TCP 只要引入了可

    2024年02月20日
    瀏覽(18)
  • 【Java EE初階十六】網(wǎng)絡(luò)原理(一)

    【Java EE初階十六】網(wǎng)絡(luò)原理(一)

    ? ? ? ? 在網(wǎng)絡(luò)原理中主要學(xué)習(xí)TCP/IP四層模型中的重點(diǎn)網(wǎng)絡(luò)協(xié)議 ? ? ? ? 應(yīng)用層是和程序員接觸最密切的; ????????應(yīng)用程序:在應(yīng)用層這里,很多時(shí)候都是程序員自定義應(yīng)用層協(xié)議(步驟:1、根據(jù)需求,明確要傳輸?shù)男畔ⅲ?、約定好信息按照什么樣的格式來組織)的

    2024年02月20日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包