最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM工作原理和工作流程簡(jiǎn)述

 更新時(shí)間:2020年07月13日 11:38:25   作者:Imadone  
這篇文章主要介紹了關(guān)于JVM工作原理簡(jiǎn)述,主要弄清楚jvm運(yùn)行的來(lái)龍去脈,感興趣的可以一起來(lái)了解一下

JAVA之所以跨平臺(tái),是因?yàn)橛蠮VM這么一個(gè)編譯和運(yùn)行機(jī)器,它令對(duì)于系統(tǒng)的操作對(duì)于用戶(hù)而言是黑盒的,使得開(kāi)發(fā)人員更快速和更注重軟件功能的實(shí)現(xiàn)。然而,也因?yàn)閖vm是黑盒,所以?xún)?nèi)部和底層具有不確定性,如果用狀態(tài)機(jī)來(lái)表示jvm,那么jvm就是一種現(xiàn)役復(fù)制不確定的狀態(tài)機(jī),因?yàn)樗臓顟B(tài)和表現(xiàn)跟系統(tǒng)、底層、硬件等等都有關(guān)系,從而狀態(tài)是不確定,如果在分布式應(yīng)用中,jvm一直以來(lái)兼容性都不是很好,這就是主要原因。盡管如此,就單一的系統(tǒng)而言,弄清楚jvm運(yùn)行的來(lái)龍去脈,對(duì)于系統(tǒng)的運(yùn)行至關(guān)重要。

理解jvm的運(yùn)行原理具有以下幾點(diǎn)充分作用:

1、針對(duì)系統(tǒng)進(jìn)行內(nèi)存和垃圾回收監(jiān)控

2、解決因內(nèi)存溢出和泄露的問(wèn)題

3、對(duì)系統(tǒng)進(jìn)行優(yōu)化

4、提升jvm和系統(tǒng)性能

jvm的運(yùn)行原理有主要有三方面,其實(shí)這也是jvm的主要工作:

1、內(nèi)存管理

2、執(zhí)行流程

3、垃圾回收

在開(kāi)始之前,有一些知識(shí)需要知道,廣義來(lái)講,jvm并不是指sun的hotspot,而是一個(gè)規(guī)范,因此不同廠商會(huì)根據(jù)規(guī)范實(shí)現(xiàn)不同的jvm,因此這些jvm的表現(xiàn)都不是一致甚至相差甚遠(yuǎn)。在jvm規(guī)范中,通常我們所能接觸的就是命令行參數(shù)了。

命令行參數(shù)

命令行參數(shù)分為三種,標(biāo)準(zhǔn)、非標(biāo)準(zhǔn)、非穩(wěn)定

標(biāo)準(zhǔn)命令行參數(shù)會(huì)在jvm規(guī)范中明確列出,強(qiáng)制實(shí)現(xiàn)的選項(xiàng),并且具有版本控制廢棄的管理通知。非標(biāo)準(zhǔn)的命令行參數(shù)不是規(guī)范強(qiáng)制并且可能沒(méi)有對(duì)應(yīng)的通知,非穩(wěn)定參數(shù)是特定調(diào)校的選項(xiàng),同時(shí)也是非標(biāo)準(zhǔn)的。標(biāo)準(zhǔn)的選項(xiàng)可通過(guò)help命令查看,非標(biāo)準(zhǔn)的選項(xiàng)通過(guò)-X為前綴訪問(wèn),非穩(wěn)定的前綴是-XX,通常對(duì)于布爾類(lèi)型的選項(xiàng),用+或-來(lái)設(shè)置true或者false,如-XX:+UseTLAB開(kāi)啟線程內(nèi)存緩沖分配。

內(nèi)存劃分

jvm是具有內(nèi)存自動(dòng)分配和管理的架構(gòu),而內(nèi)存管理自動(dòng)化是解放勞動(dòng)力的重要工具,可以對(duì)比C/C++,開(kāi)發(fā)人員不需要管理內(nèi)存,開(kāi)發(fā)效率會(huì)比較高。

在jvm中,使用的內(nèi)存分為兩類(lèi),線程共享內(nèi)存和線程私有內(nèi)存。

結(jié)合我們平時(shí)的代碼可以看出,線程共享的內(nèi)容包括方法、實(shí)例對(duì)象、常量,分別對(duì)應(yīng)共享內(nèi)存中的方法區(qū)、堆區(qū)、常量池。

堆區(qū)

堆區(qū)通常是共享內(nèi)存中最大的一塊,因此它也是GC重點(diǎn)關(guān)注區(qū)域。堆區(qū)可能是連續(xù)的也可能是不連續(xù)的,以及堆區(qū)的大小都會(huì)對(duì)GC造成相應(yīng)的影響。-Xms和-Xmx設(shè)置堆的最小和最大值,如果堆內(nèi)存大小超過(guò)最大值,則拋出OutOfMemoryError異常。

方法區(qū)

方法區(qū)存儲(chǔ)的是方法、類(lèi)的結(jié)構(gòu)信息,而常量池也包含在內(nèi),除了我們代碼中所看到的靜態(tài)常量,這些常量還包括一些字節(jié)碼內(nèi)容和類(lèi)初始化所需的特殊內(nèi)容。通常情況下,jvm不會(huì)對(duì)方法區(qū)GC直到方法區(qū)大小不夠,即使GC也只是針對(duì)常量池和類(lèi)型,所以也被稱(chēng)為永久區(qū)Permanent Generation,除了可以設(shè)置大小以外,還可以設(shè)置是否進(jìn)行GC,如果超過(guò)大小,拋出OutOfMemoryError異常。

常量池

這里說(shuō)的常量池是運(yùn)行時(shí)的,通常是字節(jié)碼中的類(lèi)的版本、描述,以及常量池表,這個(gè)表是一種符號(hào)表,在運(yùn)行的時(shí)候?qū)⑦@些符號(hào)的引用變?yōu)橹苯臃?hào)。由此可以看出,加載類(lèi)會(huì)使用常量池和方法區(qū),如果類(lèi)過(guò)多或常量過(guò)多,也會(huì)拋出OutOfMemoryError異常。

線程私有內(nèi)存區(qū)

線程私有內(nèi)存是被某一獨(dú)立線程獨(dú)占的,包括PC寄存器、java棧、本地方法棧

PC寄存器

這個(gè)寄存器是jvm內(nèi)部的,而非物理寄存器,因此也可以看出,jvm的指令執(zhí)行是基于棧架構(gòu)的,所有的操作都是經(jīng)過(guò)入棧出棧完成,為了確保線程安全,它被設(shè)定為線程私有的。通常,棧中存儲(chǔ)字節(jié)碼指令地址,如果調(diào)用的是本地方法,即native方法,則是空值。會(huì)不會(huì)拋出OutOfMemoryError異常,jvm目前沒(méi)有明確規(guī)定。

java棧

java棧的顆粒度比PC寄存器大,存儲(chǔ)方法的局部變量、操作計(jì)數(shù)、方法返回\方法出口等信息。局部變量除了我們代碼所接觸的類(lèi)型,還包括一種叫做returnAddress返回地址類(lèi)型,也是一種jvm規(guī)范的原始類(lèi)型,但是開(kāi)發(fā)人員并不能使用,實(shí)際上這種類(lèi)型標(biāo)識(shí)一條字節(jié)碼指令的操作嗎。java棧也會(huì)OutOfMemoryError異常,不過(guò)他也是可以動(dòng)態(tài)擴(kuò)展的。

本地方法棧

用于支持本地方法調(diào)用時(shí)使用,但是jvm沒(méi)有強(qiáng)制實(shí)現(xiàn),和java棧類(lèi)似。

執(zhí)行流程

我們的代碼在IDE中或者通過(guò)CMD來(lái)執(zhí)行即可看到執(zhí)行結(jié)果,而實(shí)際上每次執(zhí)行都會(huì)啟動(dòng)和關(guān)閉jvm,這個(gè)過(guò)程是相當(dāng)復(fù)雜的,下面羅列一下主要步驟。

對(duì)于sun的hotspot,launcher負(fù)責(zé)維護(hù)jvm的生命周期,包括啟動(dòng)和結(jié)束關(guān)閉。就是我們?cè)趈ava目錄下看到的java.exe和javaw.exe,一個(gè)有控制臺(tái)輸出,另一個(gè)沒(méi)有,用于執(zhí)行GUI程序。

jvm的啟動(dòng)初始化

1、解析命令行參數(shù),設(shè)置內(nèi)存大小和JIT編譯器,并且加載系統(tǒng)環(huán)境變量。

2、查找主類(lèi),并且調(diào)用本地方法JNI_CreateJavaVM創(chuàng)建jvm主線程。

3、當(dāng)jvm初始化完成,就會(huì)加載主類(lèi),如果加載成功,則調(diào)用本地方法傳入?yún)?shù),然后開(kāi)始執(zhí)行java的程序了。

其中調(diào)用本地方法JNI_CreateJavaVM創(chuàng)建jvm主線程,是jvm的啟動(dòng)過(guò)程,實(shí)際上啟動(dòng)器并非直接調(diào)用該本地方法,而是先用main()函數(shù)創(chuàng)建主線程,然后通過(guò)主線程調(diào)用javamain()函數(shù)調(diào)用該JNI_CreateJavaVM方法創(chuàng)建子線程來(lái)完成初始化并執(zhí)行java程序。因?yàn)閯?chuàng)建的主線程是操作系統(tǒng)分配的初始線程,為了更好的定制線程,通過(guò)在該線程上創(chuàng)建再初始線程來(lái)初始化jvm。

進(jìn)一步細(xì)化JNI_CreateJavaVM函數(shù)的執(zhí)行內(nèi)容,主要流程如下:

1、檢查是否線程安全,也就是是否只有一個(gè)線程調(diào)用此方法,一個(gè)線程只能創(chuàng)建一個(gè)jvm實(shí)例。

2、初始化各個(gè)模塊,如日志、計(jì)數(shù)器、內(nèi)存頁(yè)等。

3、加載核心庫(kù)并初始化線程庫(kù)

4、初始化全局?jǐn)?shù)據(jù),這步完成后就可以創(chuàng)建java子線程了

5、初始化類(lèi)加載器、解析器、編譯器、GC等模塊。其中重要一點(diǎn)就是初始化universe類(lèi)型,這種類(lèi)型是java種一切類(lèi)型的類(lèi)型,是一種數(shù)據(jù)結(jié)構(gòu),所有java的存儲(chǔ)對(duì)象都用該類(lèi)型類(lèi)存儲(chǔ)。

6、加載并初始化基礎(chǔ)類(lèi)庫(kù),如Lang、System、reflect等包。

7、返回給調(diào)用者。

通過(guò)上面的步驟,可以發(fā)現(xiàn)基礎(chǔ)類(lèi)庫(kù)是在初始化階段完成加載的,這跟開(kāi)發(fā)人員編寫(xiě)的類(lèi)庫(kù)加載順序是不同的。

jvm的關(guān)閉

當(dāng)java程序結(jié)束,jvm會(huì)先檢查有無(wú)未處理的異常以及清理這些異常,然后調(diào)用本地方法斷開(kāi)主線程跟本地方法接口的連接,如果可以斷開(kāi),說(shuō)明已經(jīng)沒(méi)有線程在運(yùn)行了,則可以安全的關(guān)閉jvm。

和JNI_CreateJavaVM方法對(duì)應(yīng)的是DestroyJavaVM方法,當(dāng)jvm在啟動(dòng)和運(yùn)行時(shí)發(fā)生錯(cuò)誤,根據(jù)嚴(yán)重程度會(huì)調(diào)用該方法關(guān)閉jvm,而在理想狀態(tài)下,即正常運(yùn)行直到退出,也是調(diào)用DestroyJavaVM方法關(guān)閉并銷(xiāo)毀jvm。停止jvm按照以下主要步驟進(jìn)行:

1、守護(hù)線程一致等待,直到只有一個(gè)非守護(hù)線程執(zhí)行。

2、停止監(jiān)控、計(jì)數(shù)器等線程。

3、移除當(dāng)前線程,釋放保護(hù)頁(yè)。

4、釋放所有資源,返回到調(diào)用者。

我們可以看出,當(dāng)需要關(guān)閉jvm時(shí),如果jvm中仍有線程在運(yùn)行,是無(wú)法強(qiáng)制關(guān)閉的,這就是為什么我們很多代碼的運(yùn)行出現(xiàn)異常后,重復(fù)的調(diào)試導(dǎo)致有多個(gè)后臺(tái)jvm在運(yùn)行卻不能自動(dòng)結(jié)束而要手動(dòng)關(guān)閉。

類(lèi)加載機(jī)制

在前面說(shuō)到,開(kāi)發(fā)人員使用的類(lèi)和基礎(chǔ)類(lèi)庫(kù)并非同一時(shí)間加載的,這是有原因的。類(lèi)的加載由類(lèi)加載器來(lái)完成,包括加載、連接、初始化三個(gè)階段。完成加載后就可以通過(guò)new來(lái)創(chuàng)建類(lèi)的實(shí)例對(duì)象了。類(lèi)的加載可以理解為根據(jù)類(lèi)的字節(jié)碼文件全路徑名讀取后轉(zhuǎn)換為與目標(biāo)類(lèi)型一致的Class類(lèi)型,并且是可以動(dòng)態(tài)加載的。

加載類(lèi)由類(lèi)加載器完成,加載器分為兩種,一種是Bootstrap Classloader引導(dǎo)加載器,另一種是User-defined Classloader用戶(hù)自定義加載器,用戶(hù)自定義加載器默認(rèn)又分為ExtClassloader和AppClassloader。

引導(dǎo)加載器是C++編寫(xiě)的,負(fù)責(zé)完成lib目錄里的類(lèi)加載,也就是前面所說(shuō)的基礎(chǔ)類(lèi)庫(kù),而ExtClassloader和AppClassloader是java編寫(xiě)的,分別負(fù)責(zé)加載lib/ext目錄和ClassPath系統(tǒng)路徑中的類(lèi)型。他們都是Classloader的子類(lèi),我們也可以通過(guò)繼承父類(lèi)來(lái)實(shí)現(xiàn)自己的類(lèi)加載器。

父類(lèi)委托模式

通過(guò)查閱類(lèi)關(guān)系樹(shù)可以發(fā)現(xiàn),AppClassloader是ExtClassloader的子類(lèi),而ExtClassloader則是Classloader的子類(lèi),java規(guī)范要求自定義的類(lèi)加載器都派生與父類(lèi),并且在進(jìn)行類(lèi)加載的時(shí)候,都要委托給直接上級(jí)父類(lèi)執(zhí)行加載,這就是父類(lèi)委托模式(parents delegation model),國(guó)內(nèi)很多翻譯為雙親委托模式,但是你會(huì)發(fā)現(xiàn)是多親模式,所以我認(rèn)為父類(lèi)委托更為合適。

父類(lèi)委托模式在執(zhí)行時(shí),子類(lèi)始終會(huì)委托父類(lèi)加載,一級(jí)一級(jí)的向上請(qǐng)求,知道最后唯一的超類(lèi)來(lái)進(jìn)行加載,如果父類(lèi)無(wú)法加載,再一級(jí)一級(jí)的退回到子類(lèi)進(jìn)行加載,這樣就不會(huì)重復(fù)加載相同的類(lèi)了。

為什么要使用父類(lèi)委托模式?因?yàn)轭?lèi)的加載必須是一次性不可重復(fù)的,試想一下,如果基礎(chǔ)類(lèi)庫(kù)中的類(lèi)可以重復(fù)加另一個(gè)類(lèi)來(lái)替換原來(lái)的類(lèi),那是多么嚴(yán)重的安全隱患,為了避免這一點(diǎn),基礎(chǔ)類(lèi)庫(kù)都是由C++編寫(xiě)的啟動(dòng)加載器來(lái)加載,但是為了兼顧擴(kuò)展性,所以除了基礎(chǔ)類(lèi)庫(kù),其他的類(lèi)都可以通過(guò)用戶(hù)加載器來(lái)加載,那么為了避免但不強(qiáng)制要求避免重復(fù)加載的情況發(fā)生,java規(guī)范就采取并建議我們按照父類(lèi)委托的方式實(shí)現(xiàn)類(lèi)加載器。

類(lèi)的加載過(guò)程

前面說(shuō)到,類(lèi)先經(jīng)過(guò)類(lèi)加載器將字節(jié)碼文件轉(zhuǎn)換為Class對(duì)象,但是這個(gè)時(shí)候并不能使用它,此時(shí)的類(lèi)結(jié)構(gòu)信息存儲(chǔ)在方法區(qū)內(nèi),還需要對(duì)其進(jìn)行驗(yàn)證,結(jié)構(gòu)信息是否有效合法,一旦通過(guò)驗(yàn)證,就會(huì)為類(lèi)中的靜態(tài)變量分配內(nèi)存空間并初始化值,這些準(zhǔn)備工作完成后,還需將類(lèi)結(jié)構(gòu)中的符號(hào)和常量表的符號(hào)進(jìn)行解析轉(zhuǎn)為直接引用,這時(shí)候的類(lèi)才具有執(zhí)行能力。最后的工作就是初始化了,也就是我們代碼中在new一個(gè)對(duì)象之前會(huì)執(zhí)行的static代碼塊。

垃圾回收機(jī)制

jvm的垃圾回收包括內(nèi)存動(dòng)態(tài)分配和內(nèi)存回收兩大塊。內(nèi)存的分配和垃圾回收是息息相關(guān)的,內(nèi)存分配的方式一定程度上決定采取何種垃圾收集器和收集算法。

前面說(shuō)到,堆內(nèi)存可以是連續(xù)也可以是不連續(xù)的,也是GC的重點(diǎn)區(qū)域,但正由于這種分布的不確定性,該GC帶來(lái)很大麻煩。首先針對(duì)連續(xù)的情況。

指針碰撞

通過(guò)前面講述的jvm啟動(dòng)過(guò)程,我們知道創(chuàng)建對(duì)象就需要在堆內(nèi)存中劃分出一部分來(lái)存儲(chǔ)對(duì)象,如果此時(shí)的內(nèi)存是規(guī)整的,那么將空閑的和已使用的各放置一邊,兩部分的邊界處用一個(gè)指針標(biāo)記,當(dāng)新增對(duì)象內(nèi)存分配,就將指針偏移相應(yīng)的位置,下一次分配內(nèi)存只需要知道最后指針偏移的位置開(kāi)始分配內(nèi)存并更新指針偏移量即可,這種方式就是指針碰撞(bump the pointer)。

空閑列表

然而,需要面臨的一個(gè)問(wèn)題首先不是規(guī)整問(wèn)題,而是線程安全,如果對(duì)指針的操作加鎖,必然會(huì)降低性能。并且如果堆不是連續(xù)的,指針碰撞就變得很棘手,此時(shí)還有一種解決辦法,就是通過(guò)一張表記錄下所有空閑的內(nèi)存,每當(dāng)分配內(nèi)存就更新表上的記錄,這種方式就是空閑列表(free list)。

不管呢種方式,都必須解決線程安全,對(duì)于指針碰撞,為了滿(mǎn)足規(guī)整的先決條件,這就要求GC收集器具有壓縮規(guī)整功能,如serial、par等收集器,而采用mark-sweep的cms這種收集器則不支持規(guī)整,因?yàn)樗褪峭ㄟ^(guò)空閑列表方式來(lái)整理的內(nèi)存的。分配內(nèi)存就需要對(duì)內(nèi)存指針進(jìn)行操作,如何確保指針的使用是線程安全的?一種做法是用過(guò)CAS原子操作來(lái)實(shí)現(xiàn),也就是所謂的失敗重試保證更新原子性。還有一種做法就是TLAB(本地線程緩沖),即在堆內(nèi)存中事先劃分一塊線程獨(dú)占的私有內(nèi)存,這樣線程就可以互不干涉的創(chuàng)建對(duì)象了,如果TLAB不夠用,再已加鎖的方式分配TLAB,并且對(duì)象的初始化還可以提前進(jìn)行。

分代劃分收集機(jī)制

目前大部分的GC都是采用分代收集算法的,換而言之,也就是內(nèi)存是分代劃分的。這當(dāng)中的設(shè)計(jì)有很多復(fù)雜和嚴(yán)格的要求,首先對(duì)算法絕對(duì)精確,不能造成誤刪和誤讀,還要保證沒(méi)用的對(duì)象及時(shí)回收,以及如何處理產(chǎn)生的碎片和系統(tǒng)停頓開(kāi)銷(xiāo)等。涉及的指標(biāo)和算法,就在另一篇中單獨(dú)闡述了。

待續(xù)......

到此這篇關(guān)于關(guān)于JVM工作原理簡(jiǎn)述的文章就介紹到這了,更多相關(guān)JVM工作原理簡(jiǎn)述內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Apache Ignite實(shí)現(xiàn)Java數(shù)據(jù)網(wǎng)格

    使用Apache Ignite實(shí)現(xiàn)Java數(shù)據(jù)網(wǎng)格

    今天我們來(lái)探討如何使用Apache Ignite來(lái)實(shí)現(xiàn)Java數(shù)據(jù)網(wǎng)格,Apache Ignite是一個(gè)高性能的內(nèi)存計(jì)算平臺(tái),它提供了分布式緩存、數(shù)據(jù)網(wǎng)格和計(jì)算功能,可以顯著提高大規(guī)模應(yīng)用的數(shù)據(jù)處理性能,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-08-08
  • Spring?boot事務(wù)無(wú)效報(bào)錯(cuò):Transaction?not?enabled問(wèn)題排查解決

    Spring?boot事務(wù)無(wú)效報(bào)錯(cuò):Transaction?not?enabled問(wèn)題排查解決

    在業(yè)務(wù)代碼中經(jīng)常需要保證事務(wù)的原子性,但是有的時(shí)候確實(shí)是出現(xiàn)事務(wù)沒(méi)有生效,這篇文章主要給大家介紹了關(guān)于Spring?boot事務(wù)無(wú)效報(bào)錯(cuò):Transaction?not?enabled問(wèn)題排查的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • springboot實(shí)現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組

    springboot實(shí)現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組

    這篇文章主要介紹了springboot實(shí)現(xiàn)string轉(zhuǎn)json json里面帶數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室

    java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室

    這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java中String.split()的最詳細(xì)源碼解讀及注意事項(xiàng)

    Java中String.split()的最詳細(xì)源碼解讀及注意事項(xiàng)

    以前經(jīng)常使用String.split()方法,但是從來(lái)沒(méi)有注意,下面這篇文章主要給大家介紹了關(guān)于Java中String.split()最詳細(xì)源碼解讀及注意事項(xiàng)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • java打jar包的幾種方式詳解

    java打jar包的幾種方式詳解

    這篇文章主要介紹了java打jar包的幾種方式,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot Starter依賴(lài)原理與實(shí)例詳解

    SpringBoot Starter依賴(lài)原理與實(shí)例詳解

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴(lài),SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴(lài)庫(kù)的處理,需要配置各種信息的困擾
    2022-09-09
  • Spring mvc結(jié)果跳轉(zhuǎn)方法詳解

    Spring mvc結(jié)果跳轉(zhuǎn)方法詳解

    這篇文章主要介紹了Spring mvc結(jié)果跳轉(zhuǎn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解

    Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗(yàn)實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MybatisPlus 多租戶(hù)架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解

    MybatisPlus 多租戶(hù)架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解

    這篇文章主要介紹了MybatisPlus 多租戶(hù)架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解,詳細(xì)的介紹了什么是多租戶(hù)架構(gòu)以及使用MybatisPlus實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11

最新評(píng)論

突泉县| 哈尔滨市| 孟连| 南郑县| 秦皇岛市| 伊吾县| 盈江县| 准格尔旗| 包头市| 门源| 廊坊市| 锦州市| 客服| 阜平县| 庆安县| 洪泽县| 图木舒克市| 汉川市| 合川市| 黄浦区| 张掖市| 定结县| 梧州市| 昌邑市| 牡丹江市| 宜兰市| 拉孜县| 凌源市| 玉林市| 石台县| 永丰县| 灵寿县| 丰都县| 东海县| 塔城市| 南岸区| 墨玉县| 呼伦贝尔市| 呼图壁县| 北宁市| 民权县|