java面試題大彙總
網上看到大佬整理的208個面試題,自己整理出來,並且加以擴充陪你過以方便自己使用。
下面是涉及到的模塊。
java基礎
JDK和JRE的區別
JRE是java運行環境,是供java應用程序的用戶使用的。
JDK是java開發工具,是供java開發人員使用的。包含了JRE和java的編譯器
== 和equals的區別
==對於基本數據類型來說直接比較數值,對於引用類型來說比較的是其內存首地址;
equals比較的是內存中存的值是否相同。對於我們自定的類使用這個方法需要重寫實現,不然效果和==是一樣的。
兩個對象的hashCode()相同,則equals()也一定爲true,對嗎?
不對。hashCode一樣只是兩者在內存中存儲的首地址是一樣的,但是值不一定一樣。
final在java中的作用
final是java中的修飾詞,可以修飾變量、方法、類。修飾變量標識變量的值時常量,必須進行初始化且不可改變,修飾方法標識方法不可被重寫,修飾類標識類不可以被繼承。
java中的Math.round(-1.5)等於多少
-1
String屬於基本數據類型嗎
不屬於
java中操作字符串有哪些類?他們有什麼區別?
String,StringBuilder,StringBuffer.
String的內容不可更改,StringBuilder和StringBuffer的內容是可以更改的;
StringBuilder是線程不安全的,StringBuffer是線程安全的。
String str=“i”;與String str=new String(“i”);一樣嗎
分配內存的方式不一樣。第一種分配在常量池中,會先在字符常量池中尋找有沒有一樣值的字符串,若有了就直接指向該地址,沒有的話會先在常量池新建一個,再進行地址指向;
而第二種會在堆內存新建一個對象,再進行指向。
如何將字符串進行反轉
可以使用StringBuilder或者StringBuffer的reserve方法進行反轉
String的常用方法都有哪些
equals方法比較兩個字符串的值是否一樣;
charAt方法輸出指定索引處字符;
getBytes方法得到字符串的字節類型的數組
indexOf方法得到指定字符的索引
replace方法進行字符替換
trim方法可以去掉字符串前後的空格
split方法可以分割字符串,返回分割後的數組
length方法返回字符串長度
toLowerCase返回轉變爲小寫之後的字符串
toUpeerCase返回轉變爲大寫之後的字符串
substring截取字符串
抽象類一定要有抽象方法嗎
不一定
普通類和抽象類有哪些區別
抽象類不能直接進行實例化,普通方法可以
普通類不可以含有抽象方法,抽象類可以含有抽象方法
抽象類能使用final修飾嗎
不能。因爲final修飾過的類不能重寫,而抽象類不重寫就沒法進行抽象方法的實現
接口和抽象類的區別
抽象類可以有構造器,而接口不可以有構造器
抽象類中的修飾符可以是任意的,而接口是可以是public的
java中可以多實現接口,但是隻可以單繼承抽象類
java中的IO流分幾種
根據功能來分:輸入流輸出流;
根據類型分:字節流字符串;
BIO、NIO、AIO有什麼區別
BIO:Block IO同步阻塞式IO,是我們平時使用的傳統的IO
NIO:New IO同步非阻塞IO,客戶端服務端通過通道Channel通訊,實現了多路複用
AIO:Asynchronized IO異步非阻塞IO
Files的常用方法有什麼
exists方法判斷路徑是否存在
createFile創建文件
createDicrectory創建文件夾
delete刪除一個文件或目錄
copy複製文件
move移動文件
size查看文件個數
read讀取文件
write寫入文件
容器
java容器都有哪些
ArrayList、LinckedList、Vector、HashSet、HashMap、HashTable、ConcurrentHashMap
Collection與Collections的區別
Collection是java中的一個集合接口,提供了一些對集合進行基本操作的方法,直接實現類有List和Set;
Collections是工具類,提供了許多方法對集合進行操作,如排序、搜索、線程安全等。
List、Set、Map的區別
List和Set是Collection的子類,存的是單個的值,Map是以鍵值對的形式存儲的
List是有序的可重複的,Set是無序的不可重複的
HashTable和HashMap有什麼區別
一是HashMap允許以null作爲鍵和值,而HashTable是不允許的
二是HashMap是線程不安全的,HashTable是線程安全的
如何決定使用HashMap還是TreeMap
若要對Map進行插入刪除操作時,應當使用HashMap,而若有排序需求的應當使用TreeMap
HashMap的實現原理
HashMap在jdk1.8之前是以數組+鏈表的形式實現的,在1.8之後是以數組+鏈表+紅黑樹的形式實現的
HashSet的實現原理
HashSet是以HashMap實現的。HashSet的值存在hashMap的key值中
ArrayList和LinkedList的區別
ArrayList底層是以數組來實現的,LinkedList的底層是以雙向鏈表來實現的。所以ArrayList的查詢效率較高,插入和刪除的效率較低,而LinkedList的查詢效率較低,插入和刪除的效率較高
如何實現數組和List的轉換
List轉數組:toArray方法
數組轉List:asList方法
ArrayList和Vector的區別是什麼
Vector是線程安全的,而ArrayList並不能保證線程的安全,所以ArrayList的性能更好
Array和ArrayList的區別
數組的長度不可改變,而ArrayList的長度是可以延長的
數組可以容納基本數據類型,也可以容納對象,而ArrayList只可以容納對象
數組沒有提供列表那麼多的方法
在Queue中poll()和remove()的區別是
poll方法在獲取元素失敗的時候會返回空,而remove會拋出異常
哪些集合類是線程安全的
Vector、HashTable、stack、enumeration(枚舉,相當於迭代器)
迭代器Iterator是什麼
迭代器是用來對集合進行遍歷使用的
Iterator怎麼使用,有什麼特點
調用Collection下的實現類提供iterator方法來獲得Iterator類的實例,使用next方法可以獲得下一個元素,而hasNext檢查序列中是否還有可遍歷的元素
Iterator和ListIterator的區別
ListIterator只可以使用在ArrayList上,而Iterator可以在Set和List中使用
Iterator只可以單向遍歷,而ListIterator既可以向前也可以向後
怎麼確保一個集合不能被修改
使用Collections下的unmodifiablexxx方法返回的集合時不可以被修改的,修改會報錯,如unmodifiableMap、unmodifiableList、unmodifiableSet
注:不能使用final來實現,因爲final修飾變量若是基本數據類型值不能修改,而修飾引用類型是地址不可修改,但是值可以修改,集合都是引用類型的。
多線程
JMM有了解嗎
JMM是對於多線程的java內存模型。在JMM中,臨界資源、共享變量在主內存中,每個線程將他們要用的變量複製一份副本到自己的本地工作內存中進行操作。在JMM中有8種基本的原子操作,分別是lock、read、load、use、assig、store、write、unlock
並行和併發有什麼區別
並行是指多個事件發生在同一時刻,如多個任務在多個cpu或者一個cpu的多個核上同時進行;
併發是一個時刻只有一個事件發生,但同一時間間隔發生多個事件,如一個cpu時間片切換進行
線程和進程的區別
進程是運行中的程序,是系統進行資源分配的調度的基本單位,一個進程中可以有一個或多個線程,線程是爭奪CPU時間片的基本單位。
各進程都有自己獨立的內存空間,而一個進程中的線程之間共享內存空間,所以進程之間的切換沒有線程那麼快
守護線程是什麼
守護線程是在程序運行時在後臺提供一種通用服務的線程。
創建線程有哪些方式
- 繼承Thread方法
- 實現Runable接口
- 實現Callable接口
- 線程池
說一下runable和callable的區別
runable需要實現的是run方法,callable需要實現的是call方法;
callable可以得到返回值,而runable沒有返回值
線程有哪些狀態
新建、就緒、運行、阻塞、死亡
sleep和wait的區別
sleep是Thread中的方法,wait是Object中的方法
sleep不釋放鎖,而wait會釋放鎖
notify和notifyAll的區別
notify只是隨機喚醒一個線程,而notifyAll會喚醒所有等待的線程,再讓他們自己去競爭cpu時間片
線程的run和start方法區別
start方法是用來喚醒線程的,喚醒之後的線程進入就緒狀態,而獲得時間片的線程再去執行run方法,run方法是線程的執行體
創建線程池有哪些方法
- newFixedThreadPool
創建一個固定長度的線程池,當提交一個任務就創建一個線程,直到達到線程的最大數量後線程數量將不再發生變化,當線程發生異常結束時,線程池會補充一個新的線程
- newCacheThreadPool
創建一個可緩存的線程池,線程池的數量不受限制,當線程的數量超過了處理的需求時候,就回收空閒的線程,當有新的需求時候就創建新的線程
- newSingleThreadExcutor
單線程的線程池,只創建一個線程來執行任務,當線程發生異常結束時,創建一個新的線程來替代。按照任務在隊列中的順序來串行執行。
- newScheduledThreadPool
創建一個固定長度的線程池,而且以延遲或定時的方式來執行任務。
線程池有哪些狀態
- running:剛創建的線程池就處於Running狀態
- shutdown:不接受新的任務,但是能處理已排隊的任務
- stop:不接受新的任務,不處理已排隊的任務,中斷正在處理的任務
- tidying:當shutdown狀態的線程池中任務數爲0後進入tidying狀態
- terminated:線程池徹底終止
轉換圖:
線程池中的submit方法和excute方法有什麼區別
submit方法的參數可以是Runable接口的,也可以是Callable接口的,而excute參數只能是runable接口的;
submit方法有返回值,而excute方法沒有返回值;
submit中拋出異常會內部處理,而excute需要我們try catch
在java中程序中怎麼保證多線程運行安全
多線程安全問題體現在:原子性、可見性和有序性
Atomic、synchronized、Lock可以解決原子性
synchronized、Lock和volatile可以解決可見性問題
Happens-Before規則可以解決有序性問題
多線程鎖的升級原理
多線程鎖從低到高有:無鎖、偏向鎖、輕量級鎖、重量級鎖
在鎖對象的對象頭裏有一個ThreadId,在鎖的創始狀態下,ThreadId是空的,當下是無鎖狀態,當有線程獲得鎖時,ThreadId中存該線程的Id,升級爲偏向鎖,當有其他的線程爭奪鎖時,偏向鎖升級爲輕量級鎖,而線程通過自旋繼續獲取鎖,執行了一定的次數還沒有得到鎖之後,就會升級爲重量級鎖。
什麼是死鎖
死鎖是多個進程相互等待的一種僵局狀況
怎麼防止死鎖
死鎖發生有四個條件:互斥、請求與保持、不可剝奪、循環等待
要防止死鎖需要破壞這些條件,互斥條件是資源使用的原則,不能破壞;
破壞請求與保持條件:線程一次性獲得所有他要用的資源
破壞不可剝奪條件:進程不能獲得所需的全部資源時就進行等待,並且要釋放已經獲得的資源給其他進程使用
破壞循環等待條件:將資源進行編號,緊缺資源編大號,進程按編號次序申請資源,要申請大號資源首先要獲得小號的資源
ThreadLocal是什麼,使用在什麼樣的場景
ThreadLocal是爲線程提供獨立的變量副本,使每個線程都能夠獨立地改變屬於自己的副本,而不影響其他線程所對應的副本。
常用於數據庫連接和session管理等
說一下synchronized的底層實現原理
synchronized底層是用監視器monitor來實現的,其中有兩個指令,一個是monitorenter,一個是monitorexit,分別是進入鎖和退出鎖的指令。
synchronized和volatile的區別
synchronized是線程安全的,可以保證原子性,而volatile無法保證原子性
synchronized和Lock的區別
synchronized是基於JVM的關鍵字,而Lock是API層面的接口
synchronized在遇到異常時會自動釋放鎖,而Lock需要我們手動釋放鎖,否則會發生死鎖的現象
synchronized是不能中斷的,而Lock可以使用interrupt方法中斷
synchronized無法獲得鎖的獲取狀態而Lock可以
synchronized與ReentrantLock的區別
synchronized是一個關鍵字,ReentrantLock是Lock的一個實現類,ReentrantLock包括了synchronized中的所有功能,還進行了擴展;
說一下atomic的原理
會調用unsafe類中的一些方法來對底層進行操作
反射
什麼是反射
反射是在運行的時候可以獲取到任意類名稱,所有屬性、方法、註解、類型、類加載器等
什麼是java序列化?什麼情況下需要序列化
序列化是將對象轉化爲字節流的過程;
當java對象需要在網絡中傳輸或持久化存儲在文件中時,就需要用到序列化。
動態代理是什麼?有哪些應用
動態代理,是在運行的時候動態地創建目標類,可以調用和擴展目標類的方法。
常使用的場景有:Spring的AOP、事務、權限、日誌。
怎麼實現動態代理
首先需要定義一個接口,然後要有一個實現InvocationHandler的類的處理類;
第二種方式是使用CGLIB,先要引入相關的jar包
對象拷貝
爲什麼要使用對象克隆
當我們需要操作對象,但是卻希望保留之前的數據時,可以使用克隆
如何實現對象克隆
方法一:實現Cloneable接口並重寫clone方法進行克隆
方法二:實現Serializable接口,通過對對象的序列化和反序列化來實現克隆,可以實現真正的深克隆
深拷貝和淺拷貝的區別
淺拷貝只拷貝到基本數據類型,而對於對象類型拷貝的是其地址,更改會影響到原對象;
深拷貝不僅拷貝了基本數據類型,對於對象類型也會拷貝一份副本,更改不會影響到原對象。
java web
jsp和servlet有什麼區別
jsp是一種特殊的servlet,jsp最終也會被翻譯成servlet;
jsp側重於視圖,而servlet側重於業務邏輯;
另外,jsp是在前端代碼中插入java語言代碼,而在servlet中要寫入前端代碼需要用write來拼接前端代碼,比較麻煩。
jsp有哪些內置對象?作用分別是什麼
request:封裝客戶端的請求
response:封裝服務器端對客戶端的響應
session:封裝會話的對象
application:風咋混個服務器運行環境的對象
page:jsp對象本身
pageContext:可以通過該對象獲得其他對象
config:web應用的配置對象
out:輸出服務器響應對象的輸出流
excetion:封裝頁面拋出的異常對象
說一下4種作用域
page的作用範圍是一個頁面;
application的作用範圍是整個應用程序
session的作用範圍是一次會話中
request的作用範圍是一次請求
session和cookie的區別
session和cookie都是用於會話跟蹤技術的;session的實現依賴於cookie,因爲cookie中存有一個sessionId來標識session
session將數據存在服務器端,而cookie將數據存儲在客戶端
所以session的安全性高於cookie
說一下session的工作原理
session是一個存在服務器端的一個類似於散列表格的文件。相當於一個map,鍵值存sessionId
如果客戶端禁止cookie能實現session嗎
可以手動在url中加入sessionId,或者將sessionId存在數據庫或文件中來實現
如何避免sql注入
使用prepredStatement來傳參數
使用正則表達式來過濾參數
jsp頁面中檢查是否包含非法字符
異常
throw和throws的區別
throws是用在方法上的,後聲明可能出現的異常類;
而throw用在方法中,用來拋出異常
final、finally、finalized的區別
final是修飾詞,用來修飾變量表示變量的值不可改變,修飾方法表示方法不可被重寫,修飾類表示類不可被繼承;
finally是在異常處理中使用的,用finally包含的代碼塊無論是否發生異常都會運行
try-catch-finally中,如果catch中return了,finally還會執行嗎
會,在return之前先執行finally的代碼
常見的異常類有哪些
空指針異常;數組越界;找不到類;類型轉換異常;sql異常等
網絡
http響應碼中301和302代表的是什麼?有什麼區別?
301和302都表示url發生了轉移
301表示永久地轉移;302表示暫時性的轉移
forward和redirect有什麼區別
forward是由服務器端發生的一次請求,實現局部的刷新,地址欄不會改變;
redirect相當於客戶端發起的兩次請求,是重新加載了一個頁面,地址欄會改變
簡述tcp和udp的區別
tcp是面向連接的,udp是無連接地發送數據;
tcp保證了可靠性,而udp不保證可靠性;
udp保證實時性;
tcp是點到點的,而udp支持一對一,一對多,多對多的交互通信
tcp爲什麼要三次握手
爲了實現可靠數據傳輸,通信雙方都要維護一個序列號,三次握手,既要保證發送方發送出了正確的數據,又要保證接收方接收到了正確的數據。
OSI的七層模型有哪些
物理層、鏈路鏈路層、網絡層、傳輸層、會話層、表示層、應用層
get和post的區別
get對應着數據的獲取,post對應着數據的更改;
get請求會將請求參數加載地址中,而post請求是將數據包含在包體中;
所以post的安全性高於get;且地址欄的長度是有限的,所以get能傳輸的參數是有限的,post可以傳輸的數據是不限制大小的;
如何實現跨域
通過jsonp實現跨域
說一下jsonp的實現原理
jsonp是json+padding,動態創建script標籤,通過script標籤的src屬性可以獲得任何域下的js腳本。
設計模式
說一說你熟悉的設計模式
單例模式:單例模式分爲餓漢式和懶漢式,餓漢式。餓漢式是一開始就對實例進行創建,而懶漢式是在需要的時候纔開始創建;單例模式的實現重點在於將構造方法私有化,在類的內部進行實例的創建,並提供方法給外部獲取。
觀察者模式:對象間一對多的依賴關係,當這一個對象狀態發生改變的時候,所有依賴他的對象都得到通知並被自動更新
裝飾者模式:對已有的業務邏輯進行封裝,使其獲得額外測功能
適配器模式:將兩個不相同的對象聯繫在一起
工廠模式:工廠模式分爲簡單工廠模式、工廠方法模式和抽象方法模式;
簡單工廠模式主要包含一個抽象的接口,一些接口的實現類和一個工廠類,
工廠方法模式主要包含抽象產品、具體產品、抽象工廠、具體工廠,
抽象工廠模式與工廠方法模式的區別是,工廠方法模式的工廠只生產單一的產品,而抽象工廠模式的工廠生產多種產品
- 簡單工廠和抽象工廠的區別
spring/spring mvc
爲什麼要使用spring
spring是在企業級開發中簡化開發工作而存在的,是一個輕量級的ioc和aop的容器框架
解釋一下什麼是aop
aop是面向切面編程,就是在java各類中都會使用到的部分抽離出來形成一個模塊,如日誌、事務、權限等
解釋一下什麼是ioc
ioc是控制反轉,我們以往創建對象使用new的形式來創建,現在將創建對象的權利交給spring容器類實現,需要使用的時候再進行依賴注入
spring有哪些主要的模塊
數據訪問/繼承、web、aop、核心容器、測試
spring中常用的注入方法有
構造器注入、setter注入、基於註解注入
spring中的bean是線程安全的嗎
本身是不具有線程安全的
spring中支持幾種bean作用域
- spring中自動裝配bean的方法有哪些
可以使用autowired註解進行自動裝配
spring的事務實現方式有哪些
使用@Transactional註解
- 首先在application配置中配置事務管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
- 在web的配置中開啓對註解的解析
<tx:annocation-driven transaction-manager="transactionManager" proxy-target-class="true"></tx:annocation-driven>
- 在代碼中使用transactional註解
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
- 說一下spring的事務隔離
說一下spring mvc的運作流程
- 客戶端發起的請求會提交到前端控制器dispatchServlet;
- 前端控制器根據HandlerMapping映射查找對應的Controller
- Controller進行業務邏輯處理,返回ModelAndView
- ModelAndView提交到前端處理器進行解析
- 將解析結果發到瀏覽器去進行顯示
spring mvc有哪些組件
dispatcherServlet中央處理器
controller控制器
handlerMapper映射處理器
@RequestMapping的作用是什麼
進行地址映射,找到對應的handler
@Autowired的作用是什麼
自動裝配
spring boot/spring cloud
- 什麼是spring boot
spring boot是一種簡化框架使用的框架。以往使用spring框架總是需要一個繁瑣的配置文件,而spring boot的主要就是簡化配置。
- 爲什麼要用spring boot
spring boot使編碼、配置、部署、監控都變得簡單許多
- spring boot核心配置文件是什麼
spring boot中的核心配置文件是application和bootstrp;
bootstrap是系統級別的,application是應用級別的
- spring boot配置文件有哪幾種類型,他們有什麼區別
spring boot的配置文件類型有application和yml兩種;
application是以key=值的形式書寫,yml是以key:值的形式編寫。yml會以空格來區分層級,容易因爲馬虎而出錯
- spring boot有哪些方式來實現熱部署
方法一:在springboot插件配置中加入springloaded的依賴,之後使用maven指令來運行
方法二:添加spring-boot-devtools依賴
mybatis
mybatis中的#{}和${}是什麼區別
#是預編譯的,$是字符串的替換
mybatis在處理#的時候先將其用?替換,再用praparedStatement來設置參數;可以防止sql注入
而$是直接進行字符串的替換;
mybatis有幾種分頁方法
方法一:數組分頁:將查詢出來的所有數據放到list中進行截取
方法二:使用sql語句,如limit或rownum的方式,傳入參數
方法三:使用攔截器
方法四: 使用RowBounds
RowBounds是一次性查詢全部結果嗎?爲什麼
不是。雖然他可以一次性查出很多數據,但是在mybatis有一個fetch size的配置,會限制一次最多出查出數據的多少
mybatis邏輯分頁和物理分頁的區別
邏輯分頁是將數據一次查詢出很多,再去進行一個結果集的分頁,在數據量比較小的情況下效率較高;
物理分頁是在查詢的時候就只返回指定頁數的數據,在數據量大的情況下效率較高
mybatis是否支持延遲加載?延遲加載的原理是什麼
mybatis中可以通過配置支持延遲加載
原理是動態代理
說一下mybatis的一級緩存和二級緩存
一級緩存是默認開啓的,作用在一次會話中,查詢的結果緩存起來,下次再有相同的查詢時就直接在緩存中取,提高效率
二級緩存是全局緩存,可用在不同會話之間。
mysql
數據庫的三範式是什麼
範式是規範的意思。
第一範式是說數據表的列不可再分隔
第二範式是說數據表中的每行數據都有一個唯一的標識,例如設置主鍵
第三範式是說數據表中不能含有其他數據表除了主鍵之外的其他列,例如設置外鍵
一張自增表裏面總共有17條數據,刪除了最後2條,重啓mysql數據庫,又插入一條數據,此時id是幾
18
如何獲取數據庫版本
select version() 可以得到mysql的數據庫版本
說一下ACID是什麼
事務的四個特性:
原子性、一致性、隔離性、持久性
char和varchar的區別
char是定長的,varchar是不定長的
float和double的區別
float是4個字節的,而double是8個字節的
mysql的內連接、做連接、右連接的區別
內連接將匹配的關聯數據都顯示出來
左連接是以左表作爲主表,保留左表的數據,顯示右表符合條件的數據
右連接以右表作爲主表,保留右表的數據,顯示左表符合條件的數據
mysql的索引是怎麼實現的
mysql的索引是以B+來實現的
怎麼驗證mysql的索引是滿足需求的
使用語句
explain select * from table where type = 1
可以查看sql是如何執行的,以此來看是否滿足
說一下數據庫的事務隔離
數據庫的事務隔離是爲了防止併發時常出現的一些問題:髒讀、不可重複讀、幻讀
事務隔離有4個級別:
讀未提交:無法避免以上三種情況
讀已提交:可以避免髒讀的情況
可重複讀:可以避免髒讀和不可重複讀的情況
串行化:可以避免以上三種情況
髒讀、幻讀分別是怎麼發生的
髒讀是兩次讀到的數據值不一樣,可能是因爲一個線程讀到了其他線程沒有提交但是後來回滾了的數據
幻讀是兩次讀取的數據數量不一樣,第二次多於第一次,可能是因爲第二次讀之前,其他線程插入了數據
說一下mysql的常用引擎
InnoDB引擎、MyIasm
如果有很多用戶同時訪問並修改數據庫中的某個字段值,怎麼保證數據的正確性
可以在代碼層面進行同步,也可以在數據庫加鎖;
代碼同步可以使用synchronized或者lock;
數據庫加鎖可以使用悲觀鎖或者樂觀鎖,悲觀鎖可以通過for update加鎖;樂觀鎖可以通過添加版本字段,通過比較後更改的方式來實現
說一下mysql的行鎖和表鎖
行鎖鎖住的只是一行數據,而表鎖鎖住的是整張表
說一下樂觀鎖和悲觀鎖
樂觀鎖認爲一般情況不會發生併發問題,只有在寫數據的時候纔會加鎖
悲觀鎖認爲總是會發生問題,所以從一開始就加鎖,無論是讀還是寫
mysql的樂觀鎖需要自己去實現,通過添加版本號字段來實現
mysql的悲觀鎖可以通過在查詢後加上for update來實現
數據庫中的事務是怎麼實現的
事務日誌,在日誌中記錄下數據和進行的操作
MVCC,在數據庫表中隱藏有兩個列,一是記錄數據的創建時間,二是記錄數據的過期時間,裏面存儲的是版本號
- mysql問題排查都有哪些手段
使用show processlist命令查看當前所有連接信息
使用explain命令查詢sql語句的執行計劃
開啓慢查詢日誌,查看慢查詢的sql
- 如何做mysql的性能優化
爲搜索字段添加索引
避免使用select *,而是列出具體的字段
jvm
說一下jvm的主要組成部分及作用
jvm主要組成:類加載器、運行時數據區、執行引擎、本地庫接口
運作:由類加載器將class文件加載到內存中,運行時數據區是代碼中變量存儲運作的地方,相對應的執行引擎將字節碼文件轉爲相對應的底層系統指令,交給cpu去執行,在執行的時候可能調用到本地庫接口。
說一下jvm運行時數據區
運行時數據區組成:堆、虛擬機棧、方法區、本地方法棧、程序計數器
說一下堆棧的區別
棧中存儲的是局部變量,堆中存的是實體;
因爲局部變量的生命週期比較短,所以棧內存更新速度比堆快;
堆中局部變量使用完了之後就會被立即釋放,而堆中的數據是回收機制不定期回收的
隊列和棧是什麼?說一下區別
隊列和棧都是存儲數據的結構,隊列是先進先出的,棧是後進先出的
什麼是雙親委派模型
類加載器收到了加載的請求,他不是去加載,而是把這個請求給父類加載器,每一層都是如此,這樣,所有的請求都被傳送到頂層啓動類加載器中去。只有當父類加載器無法完成家在請求時,纔會給子類加載器去加載。
說一下類加載的執行過程
加載:根據查找路徑找到對應的class文件,然後導入
驗證:檢查加載的class文件的正確性
準備:給類中的靜態變量分配內存空間
解析:虛擬機將常量池中的符號引用替換成直接引用的過程
初始化:對靜態變量和靜態代碼塊執行初始化的過程
怎麼判斷對象是否可以被回收
方法一是使用引用計數,當有引用的時候,計數+1,引用使用完了之後,計數-1,那些計數爲0的就可以被回收
方法二是引用可達性,使用GC Roots根來看有沒有引用,那些沒有與GC Roots有鏈接的就可以被回收
java中有哪些引用類型
強引用:不會被垃圾回收機制回收,當內存不足的時候拋出異常
弱引用:會被垃圾回收機制回收
軟引用:當內存不足的時候才被垃圾回收機制回收
虛引用:維護一個隊列,被回收的對象存在這個隊列中
引用類型 被回收時間 用途 生存時間 強引用 從來不會 對象的一般狀態 jvm停止運行時 弱引用 jvm垃圾回收時 對象緩存 gc運行後 軟引用 內存不足時 對象緩存 內存不足時 虛引用 未知 未知 未知
jvm中有哪些垃圾回收機制的算法
- 標記清除
- 標記整理
- 複製算法
- 分代算法