ftpwebrequest 無法加載或初始化請求的服務提供程序_jvm之類加載機制

什么是類加載

每個編寫的".java"拓展名類文件都存儲著需要執行的程序邏輯,這些".java"文件經過Java編譯器編譯成拓展名為".class"的文件,".class"文件中保存著Java代碼經轉換后的虛擬機指令,當需要使用某個類時,虛擬機將會加載它的".class"文件,并創建對應的class對象,將class文件加載到虛擬機的內存,這個過程稱為類加載。

類加載的生命周期

98227b8dad657666451d8e6114affbfa.png

如圖所示,JVM類加載機制分為五個部分:加載,驗證,準備,解析,初始化

加載

加載階段是類加載過程的第一個階段。在這個階段,JVM 的主要目的是將字節碼從各個位置(網絡、磁盤等)轉化為二進制字節流加載到內存中,接著會為這個類在 JVM 的方法區創建一個對應的 Class 對象,這個 Class 對象就是這個類各種數據的訪問入口。

驗證

驗證是連接階段的第一步,這一階段的目的是為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。驗證階段大致會完成4個階段的檢驗動作:

  • 文件格式驗證:驗證字節流是否符合Class文件格式的規范;例如:是否以0xCAFEBABE開頭、主次版本號是否在當前虛擬機的處理范圍之內、常量池中的常量是否有不被支持的類型。
  • 元數據驗證:對字節碼描述的信息進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規范的要求;例如:這個類是否有父類,除了java.lang.Object之外。
  • 字節碼驗證:通過數據流和控制流分析,確定程序語義是合法的、符合邏輯的。
  • 符號引用驗證:確保解析動作能正確執行。

驗證階段是非常重要的,但不是必須的,它對程序運行期沒有影響,如果所引用的類經過反復驗證,那么可以考慮采用-Xverifynone參數來關閉大部分的類驗證措施,以縮短虛擬機類加載的時間。

準備(重點)

當完成字節碼文件的校驗之后,JVM 便會開始為類變量分配內存并初始化。這里需要注意兩個關鍵點,即內存分配的對象以及初始化的類型。

  • 內存分配的對象。Java 中的變量有「類變量」和「類成員變量」兩種類型,「類變量」指的是被 static 修飾的變量,而其他所有類型的變量都屬于「類成員變量」。在準備階段,JVM 只會為「類變量」分配內存,而不會為「類成員變量」分配內存。「類成員變量」的內存分配需要等到初始化階段才開始。

例如下面的代碼在準備階段,只會為 factor 屬性分配內存,而不會為 website 屬性分配內存。

public static int factor = 3;
public String website = "www.baidu.com";
  • 初始化的類型。在準備階段,JVM 會為類變量分配內存,并為其初始化。但是這里的初始化指的是為變量賦予 Java 語言中該數據類型的零值,而不是用戶代碼里初始化的值。

例如下面的代碼在準備階段之后,sector 的值將是 0,而不是 3。

public static int sector = 3;

但如果一個變量是常量(被 static final 修飾)的話,那么在準備階段,屬性便會被賦予用戶希望的值。例如下面的代碼在準備階段之后,number 的值將是 3,而不是 0。

public static final int number = 3;

兩個語句的區別是一個有 final 關鍵字修飾,另外一個沒有。而 final 關鍵字在 Java 中代表不可改變的意思,number 的值一旦賦值就不會在改變了。既然一旦賦值就不會再改變,那么就必須一開始就給其賦予用戶想要的值,因此被 final 修飾的類變量在準備階段就會被賦予想要的值。而沒有被 final 修飾的類變量,其可能在初始化階段或者運行階段發生變化,所以就沒有必要在準備階段對它賦予用戶想要的值。

解析

解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程,解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符7類符號引用進行。

  1. 符號引用:簡單的理解就是字符串,比如引用一個類,java.util.ArrayList 這就是一個符號引用,字符串引用的對象不一定被加載。
  2. 直接引用:指針或者地址偏移量。引用對象一定在內存(已經加載)。

初始化

初始化,這個階段就是執行類構造器< clinit >()方法的過程,為類的靜態變量賦予正確的初始值,JVM負責對類進行初始化,主要對類變量進行初始化。在Java中對類變量進行初始值設定有兩種方式

  • ①聲明類變量是指定初始值
  • ②使用靜態代碼塊為類變量指定初始值

JVM初始化步驟

  • 1、假如這個類還沒有被加載和連接,則程序先加載并連接該類
  • 2、假如該類的直接父類還沒有被初始化,則先初始化其直接父類
  • 3、假如類中有初始化語句,則系統依次執行這些初始化語句

類初始化時機:只有當對類的主動使用的時候才會導致類的初始化,類的主動使用包括以下六種

  • 創建類的實例,也就是new的方式
  • 訪問某個類或接口的靜態變量,或者對該靜態變量賦值
  • 調用類的靜態方法
  • 反射(如Class.forName(“com.shengsiyuan.Test”)
  • 初始化某個類的子類,則其父類也會被初始化
  • Java虛擬機啟動時被標明為啟動類的類(Java Test),直接使用java.exe命令來運行某個主類

使用

當 JVM 完成初始化階段之后,JVM 便開始從入口方法開始執行用戶的程序代碼。

卸載

當用戶程序代碼執行完畢后,JVM 便開始銷毀創建的 Class 對象,最后負責運行的 JVM 也退出內存。

類加載器

顧名思義,類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。JVM提供了3種類加載器:

b6abc9c42f00b9b7707e5306ca00c10b.png

啟動類加載器Bootstrap ClassLoader,負責加載存放在JDKjrelib(JDK代表JDK的安裝目錄,下同)下,或被-Xbootclasspath參數指定的路徑中的,并且能被虛擬機識別的類庫(如rt.jar,所有的java.開頭的類均被Bootstrap ClassLoader加載)。啟動類加載器是無法被Java程序直接引用的。擴展類加載器Extension ClassLoader,該加載器由sun.misc.Launcher$ExtClassLoader實現,它負責加載JDKjrelibext目錄中,或者由java.ext.dirs系統變量指定的路徑中的所有類庫(如javax.開頭的類),開發者可以直接使用擴展類加載器。應用程序類加載器Application ClassLoader,該類加載器由sun.misc.Launcher$AppClassLoader來實現,它負責加載用戶類路徑(ClassPath)所指定的類,開發者可以直接使用該類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。

應用程序都是由這三種類加載器互相配合進行加載的,如果有必要,我們還可以加入自定義的類加載器。

雙親委派模型

下圖中展示了類加載器直接的關系和雙親委派模型

37d4e75eedf9451cb4cbf0a78dcdca8c.png

從圖中我們發現除啟動類加載器外,每個加載器都有父的類加載器。
雙親委派機制:如果一個類加載器在接到加載類的請求時,它首先不會自己嘗試去加載這個類,而是把這個請求任務委托給父類加載器去完成,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

f186c02d5317b8559d6df473a6197308.png

從類的繼承關系來看,ExtClassLoader和AppClassLoader都是繼承URLClassLoader,都是ClassLoader的子類。而BootStrapClassLoader是有C寫的,不再java的ClassLoader子類中。
從圖中可以看到類加載器間的父子關系不是以繼承的方式實現的,而是以組合關系的方式來復用父加載器的代碼。如果一個類加載器收到了類加載的請求,它首先會把這個請求委派給父加載器去完成,每一個層次的類加載器都是如此。 雙親委派模型的好處
Java類隨著加載它的類加載器一起具備了一種帶有優先級的層次關系。比如,Java中的Object類,它存放在rt.jar之中,無論哪一個類加載器要加載這個類,最終都是委派給處于模型最頂端的啟動類加載器進行加載,因此Object在各種類加載環境中都是同一個類。如果不采用雙親委派模型,那么由各個類加載器自己取加載的話,那么系統中會存在多種不同的Object類。

jvm類加載相關鏈接:

https://blog.csdn.net/javazejian/article/details/73413292

https://www.jianshu.com/p/3cab74a189de

https://www.fangzhipeng.com/javainterview/2019/04/15/class-loader.html

http://www.ityouknow.com/jvm/2017/08/19/class-loading-principle.html

https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html

https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392772.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【284天】我愛刷題系列(43)

叨叨兩句 身體是靈魂的載體&#xff0c;靈魂是身體的指引&#xff0c;用心維護、馴化你的身體&#xff0c;構建通道&#xff0c;指引它將力量與情緒宣泄在你想做出成績的領域&#xff0c;神奇的事情就會發生&#xff0c;哈哈。牛客網——java專項練習023 1 SuppressWarnings(“…

基于python滲透測試_Python中基于屬性的測試簡介

基于python滲透測試by Shashi Kumar Raja由Shashi Kumar Raja Python中基于屬性的測試簡介 (Intro to property-based testing in Python) In this article we will learn a unique and effective approach to testing called property-based testing. We will use Python , p…

leetcode144. 二叉樹的前序遍歷(迭代)

給定一個二叉樹&#xff0c;返回它的 前序 遍歷。示例:輸入: [1,null,2,3] 1\2/3 輸出: [1,2,3]代碼 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val…

矩陣的理解經典博客

矩陣理解一&#xff1a;https://blog.csdn.net/myan/article/details/647511 矩陣理解二&#xff1a;https://blog.csdn.net/myan/article/details/649018 矩陣理解三&#xff1a;https://blog.csdn.net/myan/article/details/1865397 關鍵結論&#xff1a; 1. 首先有空間&…

推斷圖片格式

Linux/Unix下系統推斷文件類型并不根據文件名稱&#xff0c;也即不會根據文件后綴來推斷文件的類型。從網上下載了一個圖片&#xff0c;沒有后綴&#xff0c;希望可以正確推斷出格式。以便于共享到其它平臺&#xff0c;該怎么辦呢&#xff1f; 不同文件類型的文件頭部信息不同&…

云服務器怎么設置域名,云服務器域名設置在哪里

可能不同的云服務廠商域名設置的方式略有不同&#xff0c;不過&#xff0c;大體來講&#xff0c;方法應該都差不多的。下面我們以1.打開瀏覽器&#xff0c;搜索西部數碼官網并登陸賬號密碼&#xff0c;到會員中心。2.進入管理中心后&#xff0c;在左側的業務管理中找到3.點擊服…

RHCE 學習筆記(9) 網絡管理

n這一節本來按照教學大綱應該是學習SSH&#xff0c;不過SSH有很多網絡相關的知識&#xff0c;因此老師把網絡內容提前了一些。網絡的基本知識例如IP&#xff0c;DNS&#xff0c;DHCP&#xff0c;路由協議等常識就不在此解釋了。 RHEL查看網卡的相關信息很容易&#xff0c;ifcon…

leetcode 1207. 獨一無二的出現次數(map+set)

給你一個整數數組 arr&#xff0c;請你幫忙統計數組中每個數的出現次數。 如果每個數的出現次數都是獨一無二的&#xff0c;就返回 true&#xff1b;否則返回 false。 示例 1&#xff1a; 輸入&#xff1a;arr [1,2,2,1,1,3] 輸出&#xff1a;true 解釋&#xff1a;在該數組…

地圖上繪制任意角度的橢圓_地圖上的總橢圓

地圖上繪制任意角度的橢圓或者&#xff0c;如何選擇下班后去海灘的最佳方式 (Or, how to choose the best way to walk to the beach after work) It was a cool autumn evening when Hila Kloper and I were thinking of going to the beach after work. The beach is about 2…

【NOI2014】起床困難綜合癥 貪心

從高到低按位貪心&#xff0c;討論一下初始0或1&#xff0c;分別暴力算出結果是什么 如果一開始0就能得1當然直接ans壘起來 如果1能得1而且當前m夠用&#xff0c;那也壘起來&#xff0c;同時m減掉 否則gg 2min的代碼 1 #include <bits/stdc.h>2 #define miaom(x,y) ((x &…

用原生js封裝get方法

get方法的封裝 首先我們看一下用原生js來發送請求的步驟: 1.創建請求對象 .var xhrnew XMLHttpRequest(); 2.創建open方法確認請求方式和地址 xhr.open(get,url) ps(記住get方法有參數的話在url后面用?符號連接再加上參數如:url?num3,多個參數用&符號連接); 3.監聽事件…

10一個應用阻止關機貼吧_手機該不該每天關機一次?看完才知道這么多年白用了...

晚上習慣關機睡覺的朋友們在哪里&#xff1f;舉起你們的手讓小編看看&#xff01;那么問題來了&#xff0c;你為啥要關機睡覺&#xff1f;是擔心手機“睡眠不足”&#xff0c;還是擔心屏亮會讓你忍不住的熬夜&#xff1f;然而&#xff0c;有朋友認為手機應該每天關機一次&#…

老王學linux-ftp

FTP&#xff1a;File TransferProtocol 21/tcp: 文件共享服務&#xff1a;應用層&#xff0c;ftp NFS:Network File System (RPC: Remote Procedure Call, 遠程過程調用) Samba:CIFS/SMB FTP: tcp, 兩個連接 命令連接&#xff0c;控制連接&#xff1a;21/tcp 數據連接: 主動模式…

leetcode 129. 求根到葉子節點數字之和(先序遍歷)

給定一個二叉樹&#xff0c;它的每個結點都存放一個 0-9 的數字&#xff0c;每條從根到葉子節點的路徑都代表一個數字。例如&#xff0c;從根到葉子節點路徑 1->2->3 代表數字 123。計算從根到葉子節點生成的所有數字之和。說明: 葉子節點是指沒有子節點的節點。示例 1:輸…

fritz 使用手冊_Fritz對象檢測指南:使用機器學習在Android中構建寵物監控應用

fritz 使用手冊by Eric Hsiao蕭敬軒 Fritz對象檢測指南&#xff1a;使用機器學習在Android中構建寵物監控應用 (A guide to Object Detection with Fritz: Build a pet monitoring app in Android with machine learning) Whether it is detecting plant damage for farmers, …

ajax無刷新評論的思路,ajax學習——ajax版無刷新評論(數據庫)

//Comment.htm無刷新評論type"text/javascript">//加載評論$(function() {$.post("GetComment.ashx",function(data, status) {if (status ! "success") {$("#ulComment").append($("加載數據失敗"));return;}var lines …

Numpy 新手教程(2)

翻譯自官方文檔Tentative NumPy Tutorial&#xff0c;有刪節。 基本操作 主要的算術運算符都能夠應用于數組類型&#xff0c;結果為相應元素之間的運&#xff0c;返回值為一個新的數組。 >>> a array( [20,30,40,50] ) >>> b arange( 4 ) >>> b a…

bl小說里面有個機器人管家_機器人也有攀登者,登頂珠峰的機器人來了!獨造機器人管家...

機器人也有攀登者&#xff0c;登頂珠峰的機器人來了!2019年&#xff0c;是一個具有特殊紀念意義的年份!為慶祝祖國70華誕&#xff0c;各行各業紛紛獻禮。9月30日&#xff0c;由吳京、章子怡、張譯、井柏然、胡歌等知名演員主演的年度冒險電影——《攀登者》&#xff0c;將隆重上…

python 找出監聽的端口號對號顯示

剛好做運維平臺&#xff0c;領導也有個要求是實時的查看&#xff0c;任意一臺主機的端口開啟狀態&#xff0c;實際上我已經做了腳本發郵件每天diff的功能&#xff0c;但是為了方便展示還是寫了這個腳本&#xff1a; 腳本內容&#xff1a; 123456789101112131415161718192021222…

2018年最新稅收分類編碼_2018年新編碼器調查:31,000人告訴我們他們如何學習編碼和獲得開發人員工作

2018年最新稅收分類編碼More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超過31,000人對我們的2018年《新編碼器調查》做出了回應&#xff0c;使研究人員對成年人如何學…