2021年網易Java崗面試必問
面:為什麼要使用雙親委派機制去載入類?
答:避免多份同樣位元組碼的載入,浪費記憶體。
類的載入方式
- 隱式載入:new
- 顯示載入:loadClass、forName等
類的裝載過程如下圖:
面:loadClass和forName的區別?
- Class.forName得到的class是已經初始化完成了的 (MySQL載入驅動時,需要呼叫靜態程式碼塊完成一些操作)
- ClassLoader.loadClass得到的class是還沒有連結的。(用於Spring IoC中的延遲載入機制)
Java記憶體模型
JVM記憶體模型——JDK8如下圖所示:
- 執行緒私有:程式計數器、虛擬機器棧、本地方法棧
- 執行緒共享:MetaSpace、Java堆
程式計數器(PC)
- 當前執行緒所執行的位元組碼行號指示器(邏輯)
- 通過改變計數器的值來選取下一條需要執行的位元組碼指令
- 和執行緒是一對一的關係即“執行緒私有”
- 對Java方法計數,如果是Native方法則計數器的值為Undefined
- 不會發生記憶體洩漏
Java虛擬機器棧(Stack)
- Java方法執行的記憶體模型
- 包含多個棧幀(一個棧幀包括區域性變量表、操作棧、動態連結、返回地址等,方法的呼叫即對於棧幀從虛擬機器Stack中入棧到出棧的過程)
- 當執行緒請求的棧深度超過最大值,會丟擲 StackOverflowError 異常;
- 棧進行動態擴充套件時如果無法申請到足夠記憶體,會丟擲 OutOfMemoryError 異常。
本地方法棧
與虛擬機器棧相似,主要作用於標註了native的方法。
元空間(MetaSpace)
用於存放已被載入的類資訊、常量、靜態變數。
面:談談元空間(MetaSpace)和永久代(PermGen)的區別?
- 均是方法區(JVM的一種規範)的實現
- JDK8後元空間替代了永久代
- 元空間使用本地記憶體,而永久代使用的是jvm記憶體,這解決了空間不足的問題。
面:MetaSpace相比PermGen的優勢?
- 字串常量池(JDK1.7開始移動到Java堆中)存在與永久代中,容易出現效能問題和記憶體溢位
- 類的方法的資訊大小難以確定,給永久代的大小的指定帶來了困難
- 永久代會為GC帶來不必要的複雜性
- 方便HotSpot與其他JVM如Jrockit的整合(因為永久代是HotSpot獨有的)
Java堆(Heap)
- 是物件例項的分配區域
- GC管理的主要區域
面:說說JVM三大效能調優引數-Xms、-Xmx、-Xss的含義?
java -Xms128m -Xmx128m -Xss256k -jar xxx.jar
- -Xss:規定了每個執行緒虛擬機器棧(堆疊)的大小
- -Xms:堆的初始值
- -Xmx:堆能達到的最大值
一般將-Xms與-Xmx設定為同樣的數值,避免堆擴容時發生的記憶體抖動,影響程式的穩定性。
記憶體分配策略
- 靜態儲存:編譯時確定每個資料目標在執行時的儲存空間需求
- 棧式儲存:資料區需求在編譯時未知,在執行時模組入口前確定
- 堆式儲存:編譯時或執行時模組入口都無法確定需求,需要動態分配
面:談談Java記憶體模型中堆和棧的區別與聯絡?
- 聯絡:引用物件、陣列時,棧裡定義變數來儲存堆中目標的首地址
- 管理方式:棧自動釋放,堆需要GC
- 空間大小:一般棧比堆小
- 碎片相關:棧產生的記憶體碎片遠小於堆
- 分配方式:棧支援靜態和動態分配,而堆僅支援動態分配
- 效率:棧的效率比堆高(棧只有入棧與出棧)
面:請解釋下JDK6和JDK6+下intern()方法的區別?
- JDK6:當呼叫intern方法時,如果字串常量池先前已創建出該字串物件,則返回池中的該字串的引用。否則將此字串物件新增到字串常量池中,並且返回該字串物件的引用。
- JDK6+:當呼叫intern方法時,如果字串常量池先前已創建出該字串物件,則返回池中該字串的引用。否則,如果該字串物件已經存在與Java堆中,則將堆中對此物件的引用新增到字串常量池中,並且返回該引用;如果堆中不存在該物件,則在字串常量池中建立該字串並返回其引用。
Spring全套教學資料
Spring是Java程式設計師的《葵花寶典》,其中提供的各種大招,能簡化我們的開發,大大提升開發效率!目前99%的公司使用了Spring,大家可以去各大招聘網站看一下,Spring算是必備技能,所以一定要掌握。
**資料領取方式:點選這裡前往藍色傳送門
百度網盤連結:pan.baidu.com/s/1BDrBZ5sv4rzxyDDFLbpocw
提取碼:exa7
**
目錄:
部分內容:
Spring原始碼
- 第一部分 Spring 概述
- 第二部分 核心思想
- 第三部分 手寫實現 IoC 和 AOP(自定義Spring框架)
- 第四部分 Spring IOC 高階應用
基礎特性
高階特性 - 第五部分 Spring IOC原始碼深度剖析
設計優雅
設計模式
注意:原則、方法和技巧 - 第六部分 Spring AOP 應用
宣告事務控制 - 第七部分 Spring AOP原始碼深度剖析
必要的筆記、必要的圖、通俗易懂的語言化解知識難點
腳手框架:SpringBoot技術
它的目標是簡化Spring應用和服務的建立、開發與部署,簡化了配置檔案,使用嵌入式web伺服器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。
Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。
- SpringBoot入門
- 配置檔案
- 日誌
- Web開發
- Docker
- SpringBoot與資料訪問
- 啟動配置原理
- 自定義starter
微服務架構:Spring Cloud Alibaba
同 Spring Cloud 一樣,Spring Cloud Alibaba 也是一套微服務解決方案,包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。
- 微服務架構介紹
- Spring Cloud Alibaba介紹
- 微服務環境搭建
- 服務治理
- 服務容錯
- 服務閘道器
- 鏈路追蹤
- ZipKin整合及資料持久化
- 訊息驅動
- 簡訊服務
- Nacos Confifig—服務配置
- Seata—分散式事務
- Dubbo—rpc通訊
Spring MVC
目錄:
部分內容: