天天看點

【牛客網面經整理】0805百度面經

大家在整理面經時建議将相關問題全部整理;

1、Spring AOP,JDK代理和CGlib代理的差別,除了針對接口和類以外的不同?

答:

Spring AOP是運作時織入的,那麼運作時織入是怎麼實作的呢?

通過代理對象實作。

代理:靜态代理,動态代理;

靜态代理:由程式員建立或特定工具自動生成源碼,再對其編譯,在程式運作前,代理類的.class就已經存在了。

動态代理:在程式運作時,通過反射機制建立

靜态代理的局限性:靜态代理的每一個代理類隻能為一個接口服務,這樣一來程式開發中必然會産生過多的代理,會産生過多的重複代碼。

解決辦法:通過一個代理類完成全部的代理功能(動态代理)

動态代理類的位元組碼在程式運作時由Java反射機制動态生成,無需程式員手工編寫它的源代碼。動态代理類不僅簡化了程式設計工作,而且提高了軟體系統的可擴充性,因為Java反射機制可以生成任意類型的動态代理類。java.lang.reflect包中Proxy類和InvocationHandler接口提供了生成動态代理類的能力。

Spring AOP使用動态代理技術在運作期織入增強的代碼,主要有兩種代理機制:JDK動态代理;CGLib動态代理

JDK動态代理(基于接口的代理):

涉及的類:java.lang.reflect包下的兩個類:Proxy類和InvocationHandler接口

實作要點:1:通過java.lang.reflect.Proxy類來動态生成代理類

2、代理類要實作InvocationHandler接口,具體操作由invoke()方法

public Object invoke(Object proxy,Method method,Object[] args)throws Throwable;

Object proxy:指被代理的對象

Method method:要調用的方法

Object[]args:方法調用時所需要的參數

3、JDK代理隻能基于接口進行動态代理

CGLib代理模式(基于繼承的代理):

CGlib采用非常底層的位元組碼技術,基于ASM的位元組碼生成庫,可以為一個類建立子類,并在子類中采用方法攔截的技術攔截所有的父類方法的調用,并順勢織入橫切邏輯,也是通過方法去反射調用目标對象的方法

1、配置

2、代理實作MethodInterceptor方法

總結:

JDK優點:1、不依賴第三方jar包,使用友善

2、随着jdk更新,性能穩定提升

3、隻能代理實作接口的類

4、如果程式需要頻繁、反複地建立代理對象,則JDK動态代理在性能上更占優

CGLib優點:1、由于是動态生成位元組碼實作代理,是以代理對象的執行速度較快.

2、可以代理沒有實作接口的對象

3、不能代理final類

4、執行快生成速度慢

5、不需要頻繁建立代理對象的應用,如Spring中預設的單例bean,隻需要在容器啟動時生成一次代理對象

怎麼設計實作一個事務?

作者:咚咚锵233

連結:https://www.nowcoder.com/discuss/497119

來源:牛客網

事務的ACID

答:參考https://editor.csdn.net/md/?articleId=108298117

隔離級别應用于什麼場景解決什麼問題

答:

假如現在讀寫有10%的機率沖突,用什麼隔離級别

答:

JVM記憶體區域

答:

共享空間和私有空間可能會存在的問題

答:

堆裡邊會存儲什麼内容

答:https://blog.csdn.net/ghost_Programmer/article/details/40891735?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

對象的實體

java中資料的5種存儲位置?

  • 寄存器(最快):位于處理器内部,自動配置設定,無法人為控制
  • 棧(第二快):位于記憶體區域,通過棧指針來操作,向下移動,配置設定記憶體;向上移動,釋放記憶體。常用于存放對象引用和基本資料類型,而不用于存儲對象實體。
  • 堆:位于記憶體區域。存放的資料由jvm自動管理。好處:編譯器不需要知道存儲的資料在堆裡存活多長時間。當new 的時候,會自動配置設定,是以要花費更多時間。
  • 常量池:常量(字元串常量和基本類型常量)通常直接存儲在程式代碼内部(常量池)。儲存在編譯器就已經确定的,已編譯的class檔案的一分資料。包括了關于類,方法,接口等中的常量,也包括字元串常量,如String s=“java”
  • 非記憶體存儲區:如果資料完全存活于程式之外,可以不受程式任何控制:流對象和持久化對象

堆棧記憶體兩種存儲方式的異同之處?

  • 相同點:堆和棧都用于程式中的資料
  • 不同點:1、存儲資料類型:棧記憶體中存放局部變量(基本資料類型和對象引用),而堆記憶體中存放對象(實體)。

    2、存儲速度:棧記憶體的存儲配置設定與清理速度更快于堆,并且棧記憶體的存儲速度僅次于直接位于處理器當中的存儲器。

    3、靈活性:堆記憶體靈活性優于棧

棧記憶體和堆記憶體的存儲資料類型為何不同?

答:對象類型資料在程式編譯期,并不會在記憶體中進行建立和存儲,而在運作期,才根據需要就行動态建立和存儲,是以對象由堆記憶體進行存儲管理;

局部變量的大小和生命周期都可以被确認,符合棧記憶體的存儲特點。

垃圾回收方法,垃圾回收器

答: GC垃圾回收機制: 1、将記憶體中不再被使用的對象進行回收; 2、按照新生代舊生代的方式來對對象進行回收; 3、主要回收區域:堆,方法區;

4、對象被标記為垃圾的方法:可達性分析法;引用計數法

5、垃圾回收算法:(1)标記清除算法(2)複制算法(3)标記整理算法(4)分代回收算法 6、Full

GC的條件:jvm會首先檢查老年代的連續空間是否大于新生代對象總大小或曆次晉升的平均大小,如果條件成立首先進行minor gc,否則full GC;

垃圾回收器:

  • 新生代收集器:Serial、ParNew、Parallel Scavenge
  • 老年代收集器:CMS、Serial Old、Parallel Old
  • 整堆收集器: G1

哪些參數會影響到垃圾回收時間

答:-XX:GCTimeRatio=n:設定垃圾回收時間占程式運作時間的百分比。公式為1/(1+n)

-XX:MaxGCPauseMillis=n:設定并行收集最大暫停時間

什麼時候會發生fullGC

答:堆記憶體劃分為Eden、Survivor和Tenured/old空間

1、System.gc()方法的調用

2、老年代空間不足;

3、永生區空間不足;

4、CMS GC 時出現promotion failed和concurrent mode failure(采用CMS進行老年代GC)

5、HandlePromotionFailure(在發生mioner GC時,虛拟機會先檢查老年代最大可用的連續空間是否大于新生代所有對象總空間,如果成立,則minor gc否則full gc)

6、堆中配置設定很大記憶體

快速判斷一個數是不是2的幂次

答:判斷整數對應的二進制串中隻包含一個1;

n&(n-1)==0;

樹的最大高度

答:遞歸,左右孩子的最大高度