成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說一下類加載的過程

開發 前端
「理解和方法的作用還是很有必要的,因為經常有些面試題問靜態代碼塊,構造代碼塊,構造函數的執行順序?!?/div>

[[413663]]

加載

當我們要使用一個類的時候,要通過ClassLoader將類加載到內存中

「類加載階段主要完成如下三件事情」

  • 通過全類名,獲取類的二進制流
  • 解析類的二進制流為方法區內的數據結構
  • 創建一個java.lang.Class類的實例,表示該類型,作為方法區這個類的訪問入口

「通過全類名,獲取類的二進制流的方式有很多種」

  1. 從zip壓縮包中獲取
  2. 從網絡中獲取
  3. 運行時計算生成,如動態代理技術
  4. ...

「對于非數組類型的加載階段,即可以使用Java虛擬機內置的類加載器去完成,也可以使用用戶自定義的類加載器去完成」

鏈接

「鏈接這個階段主要分為3個部分,驗證,準備,解析」

驗證

「驗證階段主要是確保Class文件的格式正確,運行時不會危害虛擬機的安全」

驗證階段的規則很多,但大致分為如下4個階段

「具體詳細的內容,我就不詳細解釋了,可以看《深入理解Java虛擬機》,本篇文章偏向于做一個總結,把握類加載的一個整體流程,而不對細節進行闡述」

準備

「準備階段主要是為類的靜態變量分配內存,并將其初始化為默認值」

常見的數據類型的默認值如下

數據類型 默認值
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
boolean false
char '\u0000'
reference null

「如果類靜態變量的字段屬性表中存在ConstantValue屬性,則直接執行賦值語句」

那么什么情況下類靜態變量的字段屬性表中存在ConstantValue屬性呢?

  1. 類靜態變量為基本數據類型,并且被final修飾
  2. 類靜態變量為String類型,被final修飾,并且以字面量的形式賦值

為了方便查看Class文件的字節碼,我在IDEA中下載了一個插件jclasslib Bytecode viewer,非常方便。用如下代碼通過字節碼的形式驗證一下

  1. public class Person { 
  2.  
  3.     private static int age = 10; 
  4.     private static final int length = 160; 
  5.     private static final String name = "name"
  6.     private static final String loc = new String("loc"); 

「所以length和name屬性在準備階段就會賦值為ConstantValue指定的值」

「那么age和loc屬性會在哪個階段賦值呢?是在初始化階段,后面會詳細介紹哈」

解析

「將類,接口,字段和方法的符號引用(在常量池中)轉為直接引用」符號引用:用一組符號來描述所引用的目標 直接引用;直接指向指向目標的指針

加入我寫了一個如下的類

  1. public class Student { 
  2.  
  3.     private String name
  4.     private int age; 
  5.  
  6.     public String getName() { 
  7.         return this.name
  8.     } 

以字段為例,name和age對應的對象并不是直接指向內存地址,而是用字符串來進行描述(即符號引用)。解析階段就是將這些描述轉為直接指向目標的指針(即直接引用)

初始化

「執行類靜態成員變量賦值語句和靜態代碼塊中的語句」

我們把上面的Student代碼改成如下形式

  1. public class Student { 
  2.  
  3.     private String name
  4.     private int age = 10; 
  5.     private static int gender = 1; 
  6.  
  7.     { 
  8.         System.out.println("構造代碼塊"); 
  9.     } 
  10.  
  11.     static { 
  12.         System.out.println("靜態代碼塊"); 
  13.     } 
  14.  
  15.     public Student() { 
  16.         System.out.println("構造函數"); 
  17.     } 
  18.  
  19.     public String getName() { 
  20.         return this.name
  21.     } 

可以看到字節碼中包含了3個方法,getName方法我們知道,<init>和<clinit>方法里面執行了哪些邏輯

從字節碼的角度分析一波

「<init>方法」

從字節碼可以看到方法的主要邏輯為

  • 調用父類的方法
  • 非靜態成員變量賦值
  • 執行構造代碼塊
  • 執行構造函數

「<clinit>方法」

從字節碼可以看到方法的主要邏輯為

  1. 執行靜態變量的賦值語句
  2. 執行靜態代碼塊中的語句
  3. 需要注意的一點是,「Java虛擬機會保證子類的方法執行前,父類的方法已經執行完畢」

「理解方法的作用還是很有必要的,因為經常有些面試題問靜態代碼塊,構造代碼塊,構造函數的執行順序。」

我這里就直接總結一下結論,大家可以寫demo驗證一下

「沒有繼承情況的執行順序」

  1. 靜態代碼塊和靜態成員變量,執行順序由編寫順序決定(只會執行一次哈)
  2. 構造代碼塊和非靜態成員變量,執行順序由編寫順序決定
  3. 構造函數

「有繼承情況的執行順序」

  1. 父類的靜態(靜態代碼塊,靜態成員變量),子類的靜態(靜態代碼塊,靜態成員變量)(只會執行一次哈)
  2. 父類的非靜態(構造代碼塊,非靜態成員變量),父類的構造函數
  3. 子類的非靜態(構造代碼塊,非靜態成員變量),子類的構造函數

卸載

垃圾收集不僅發生在堆中,方法區上也會發生。但是對方法區的類型數據回收的條件比較苛刻

以下圖為例,想回收方法區中的Simple類

  1. 需要保證堆中的Sample類及其子類都已經被回收
  2. 加載Sample類的MyClassLoader已經被回收
  3. Sample類對應的Class對象已經被回收

可以看到對方法區的類型數據回收的條件比較苛刻,但是收效甚微,所以有些垃圾收集器不會對方法區的類型數據進行回收

總結

類加載過程

 

變量的賦值過程

本文轉載自微信公眾號「Java識堂」,可以通過以下二維碼關注。轉載本文請聯系Java識堂公眾號。

 

責任編輯:武曉燕 來源: Java識堂
相關推薦

2023-09-12 14:56:13

MyBatis緩存機制

2022-06-06 15:33:20

線程Java釋放鎖

2023-02-18 13:34:14

Nacos健康檢查機制

2025-03-10 07:05:07

2022-06-07 12:03:33

Java內存模型

2023-02-08 08:32:41

輪詢鎖

2023-12-29 13:45:00

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2024-02-21 16:42:00

2020-07-30 07:58:36

加密算法

2024-02-27 15:23:48

RedLock算法Redis

2021-06-02 11:25:18

線程池Java代碼

2023-01-30 15:39:40

GETHTTP

2021-11-27 08:13:13

Final 面試

2023-11-29 08:00:53

JavaTreeMap底層

2024-02-20 08:13:35

類加載引用Class

2021-11-08 15:59:01

MyBatis關聯開發

2021-08-28 09:06:11

Dubbo架構服務

2023-03-08 07:46:53

面試官優化結構體

2021-08-13 07:23:15

架構秒殺系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美操操操 | 国产成人午夜高潮毛片 | av一级久久| 免费观看视频www | 福利精品 | 欧美日韩在线观看视频 | 日韩综合| 五月婷婷亚洲 | 欧美一区精品 | 午夜a v电影| 精品一区二区三区电影 | 日韩欧美一区二区三区免费观看 | 色偷偷888欧美精品久久久 | 超碰在线人 | 精品国产成人 | 亚洲人成在线观看 | 国产免费看 | 欧美二区乱c黑人 | 中文字幕日本一区二区 | 国产精品日韩 | www.国产精品 | 奇米超碰 | 国产精品亚洲第一 | 日本精品免费在线观看 | 羞羞视频网站免费观看 | 日韩电影免费观看中文字幕 | 亚洲精品一区二三区不卡 | 亚洲欧美综合精品久久成人 | 黄色网址大全在线观看 | 亚洲国产精品一区二区久久 | 91大神xh98xh系列全部 | 久久麻豆精品 | 亚洲精品国产成人 | 国产精品成人一区二区三区夜夜夜 | 亚洲天堂av网 | 中文字幕日韩一区 | 日韩精品在线一区 | 91九色视频在线 | 国产一区二区三区高清 | 欧美日韩一区二区三区视频 | 日本人和亚洲人zjzjhd |