java開發3~5年工作經驗面試題


java開發3~5年工作經驗面試題

關於java虛擬機

平時我們的Java文件是如何運行的?

public class Math{
    public static final int data=666;
    public static User user = new User();

    public int compute(int a,int b){ //一個方法對應一塊棧幀內存區域
        return a+b;
    } 
    public static void main(String[] args){
		Math math = new Math();
        math.compute(1,2);
    }
}

Java文件由JVM編譯成class文件。。。

堆:當我們創建一個對象時,會把對象放在堆里面。

棧(線程):當執行一個方法時,會在棧中給該方法分配一塊內存區域,這個內存區域暫且稱為小W

棧幀:小W相當於一個先進后出的隊列,執行A方法時,會創建一個棧幀,小W會為該棧幀分配區域用於儲存A方法的局部變量,如果A方法里調用了B方法,然后執行到了B方法時,再創建一個B方法的棧幀,小W會為該棧幀分配區域用於儲存B方法的局部變量,執行完B方法后,該棧幀會被刪除,意為出棧,最后執行完A方法后,刪除A方法的棧幀。

對象是存儲在堆里,局部變量存儲在局部變量表里,那如果局部變量是一個對象怎么搞的?

當然是先把對象存儲到堆里,然后把該對象的在堆中的地址或引用存儲在局部變量表中。同理,靜態變量是存儲在方法區中,如果靜態變量是一個對象,先把對象存儲到堆里,也是在方法區中存儲的對象的引用。

程序計數器:是每個線程都獨有的,程序計數器上面那一大塊內存會挖一塊分給每一個線程。

面試題案例:為什么每個方法區都要有一個程序計數器?

比如一個方法執行到了第五行的代碼,突然出現一個優先級跟高的線程奪走了CPU分片,該方法會掛起,當優先級高的方法執行完畢后會繼續執行該方法,程序計數器的作用就是標記該方法執行到哪里了,要接着繼續執行下去。

方法區:存放常量、靜態變量和類信息

本地方法棧:和棧沒什么區別,唯一的區別是,本地方法棧是給native修飾的方法分配空間的。

堆區

堆區分為年輕代和老年代。

提一個概念:可達性分析算法(minor gc)

將GC ROOTS對象作為起點,從這些節點開始向下搜索引用的對象,找到的對象都標記為非垃圾對象,其余未標記的對象都是垃圾對象。

GC ROOTS根節點:線程棧的本地變量、靜態變量、本地方法棧的變量等等。

上面的圖示,字節碼執行引擎執行class文件,但同時還會執行垃圾收集線程,收集垃圾的模式就是可達性分析算法,本來堆中的Eden區域存儲着所有的對象,然后經過可達性分析算法后,將標記的非垃圾對象轉移到 s0 區域中,Eden中剩下的對象都為垃圾對象,全部清理掉,繼續接收存儲新的對象。

s0區域經過可達性分析算法之后,將非垃圾對象轉移到s1區域中,s0剩下的垃圾對象全部清理掉。

每進行一次可達性分析算法,篩選下來的對象的年齡就加一,如果年齡達到15之后,則存儲在老年代空間中。

JVM調優具體調優什么?

減少full gc!

上面說的是minor gc垃圾回收算法,這里提到full gc垃圾回收算法

當老年代空間被占滿之后會觸發full gc垃圾回收,這時會停到所有的用戶線程(STW)(即用戶訪問),專心回收整個堆中的垃圾對象,平時full gc需要的時間會很少,幾乎沒有感知,但是如果full gc花費時間長的話,用戶角度就是死機狀態,所以要優化!

面試題案例:什么是STW?既然知道STW的存在會造成所謂死機的狀態,那存在的意義是什么?

假如STW(停掉用戶線程)不存在,當老年代空間占滿之后就會觸發full gc垃圾回收,那么此時,用戶線程執行正在執行中,full gc從GC ROOTS根節點開始搜索,然后標記哪些對象是垃圾,哪些對象不是垃圾,但是標記好之后,用戶線程執行完了,用戶線程的局部變量也銷毀了,對象在堆中的引用也就沒了,本來標記為了不是垃圾,現在又是垃圾,那到底是不是垃圾?煩死了!難道要full gc再重新搜索標記一遍嗎?真要那樣的話,用戶進程也一直在繼續執行,結束,執行,結束,那full gc則永遠也停不下啦!

面試題案例:JVM垃圾回收機制,何時觸發MinorGC等操作?

Minor GC 也被稱為新生代 GC,指發生在新生代(PSYoungGen)的垃圾收集動作,新生代包括三塊內存區域 eden 區,from (From Survivor)區 與 to(To Survivor) 區。對象優先在 eden 創建並區分配內存,當 eden 區內存無法為一個新對象分配內存時,就會觸發 Minor GC。至於為什么把新生代分為 3 個區,主要是為了新生代復制算法的實現。

關於JVM

JVM中一次完整的GC流程是怎樣的,對象如何晉升到老年代,Minor GC、Major GC和Full GC之間的區別

關於java基礎

String類為什么是final的?
Java中的隊列都有哪些,有什么區別
String,StringBuilder,StringBuffer區別是什么?底層數據結構是什么?分別是如何實現的?
HashSet的底層實現是什么?它與HashMap有什么關系?
Java 如何重寫對象的 equals 方法和 hashCode 方法?為什么需要重寫?
使用HashSet存儲自定義類對象時為什么要重寫equals和hashCode方法?
HashMap的底層原理(數組+鏈表+紅黑樹)面試必考題
ArrayList和LinkedList底層實現原理、性能差異
JDK1.7和JDK1.8中HashMap為什么是線程不安全的?
ConcurrentHashMap的底層實現原理與源碼剖析
JDK1.7和JDK1.8中ConcurrentHashMap底層實現的區別
並發編程的鎖機制 synchronize和lock的區別
什么是CAS? Java樂觀鎖之CAS操作
hashMap和hashTable底層原理的區別?hashTable的put()做了哪些事?
volatile關鍵字的理解;用在哪些場景?
線程的兩種實現方式,以及區別
NIO與IO的區別
Java IO與NIO的區別、BIO、NIO、AIO
static關鍵字的場景和意義
什么是事務,怎么理解事務?
動態代理的兩種實現方式
面試必備之樂觀鎖與悲觀鎖
xml文件有幾種定義形式?解析方式?
徹底搞清分庫分表
MySQL--事務隔離級別及傳播機制
JAVA設計模式總結之23種設計模式
Servlet底層原理、Servlet實現方式、Servlet生命周期
Java對象的序列化和反序列化
java反射中,Class.forName和classloader的區別
session和cookie的區別和聯系,session的生命周期,多個服務部署時session管理
Java中的隊列都有哪些,有什么區別
Java7、Java8的新特性
spring中BeanFactory和FactoryBean的區別
代理模式與裝飾者模式的區別
畫一下Java多線程幾種狀態變更的圖,圖中包括線程所處的狀態及線程各個狀態之間如何進行切換的
Java中靜態變量和實例變量的區別
BIO、NIO和AIO的區別
JAVA關於靜態static的面試題

8張圖帶你理解Java內存區域
int與integer的區別(基本數據類型與引用數據類型)

get和post的區別?

1,get請求的參數拼接在url上面,post請求的參數在請求體中

2,get請求的url大小限制在1024kb,post的請求體大小沒有限制,可以用來傳輸大數據

3,get請求用於查詢數據,post請求常用來提交數據

4,get請求發送一次請求,把請求頭和請求體一起發送給服務器,服務器響應200,post請求發送兩次請求,第一次先發送請求頭,待服務器響應100后再發送請求體,服務器響應200,耗時較長,因此get請求效率比post效率高。

tcp和udp的區別
springmvc和springboot的區別
面向對象和面向過程的思想
session和cookie的區別和聯系,session的生命周期 多個服務部署時session管理
反射創建類實例的三種方式是什么?
LinkedHashMap和HashMap的比較使用
反射中,Class.forName和ClassLoader.loadClass區別
什么是一致性Hash算法?Redis集群的應用
是否可以從一個static方法內部發出對非static方法的調用?
sleep和wait的區別

內容 鏈接地址
Java基礎知識面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390612
Java集合容器面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588551
Java異常面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390689
並發編程面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104863992
JVM面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390752
Spring面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397516
Spring MVC面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397427
Spring Boot面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397299
Spring Cloud面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397367
MyBatis面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/101292950
Redis面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/103522351
MySQL數據庫面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104778621
消息中間件MQ與RabbitMQ面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588612
Dubbo面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390006
Linux面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588679
Tomcat面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397665
ZooKeeper面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397719
Netty面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/104391081
架構設計&分布式&數據結構與算法面試題(2020最新版) https://thinkwon.blog.csdn.net/article/details/105870730

高並發 / 多線程 / 分布式

Volatile與synchronize的區別
(Java並發編程) volatile關鍵字解析
springboot與spring相比優勢是什么?
Java線程池的四種用法與使用場景
線程等待wait()和通知notify()的詳細使用
Java線程池實現原理
Linux搭建Redis集群主從復制和哨兵模式
Redis持久化的幾種方式,優缺點是什么? 內存型數據庫Redis,是如何實現持久化的?
Redis的緩存失效策略
生產環境中的 Redis 是怎么部署的?
項目中緩存是如何使用的?為什么要用緩存?
redis分布式鎖,面試官請隨便問,我都會
解釋一下什么是ThreadLocal?如何使用?
一文秒懂 Java 守護線程 ( Daemon Thread )
線程池異步回調的方式

網絡通信

怎么理解http是無狀態通信,http的請求方式有哪些,可以自己定義新的請求方式么?
TCP 三次握手,為什么是三次?兩次可以嗎?
tcp協議三報文握手過程_一文徹底搞懂 TCP三次握手、四次揮手過程及原理
http協議的狀態碼
TCP三次握手、四次揮手的理解

Spring

springIOC的理解和實現原理
spring是如何通過xml配置或者注解配置生成實例對象的?
Spring AOP底層實現的基本原理
Spring MVC 中 如何解析視圖及視圖解析的詳細流程
Spring常用注解
代碼中事務是如何控制的?
spring框架中需要引用那些jar包,以及這些jar包的用途
Spring中的BeanFactory和ApplicationContext之間的區別和聯系
spring注入的幾種方式
@Autowired和@Resource的區別

SpringBoot

Spring boot啟動類上的注解@springbootApplication注解的說明
Spring和SpringBoot的區別和比較
SpringBoot自動判斷項目是否是Web項目
超詳細java中的ClassLoader詳解
Spring如何解決循環依賴的問題的?比如A autowired B,B autowired A,內部是如何實現的?
高頻面試題:Spring 如何解決循環依賴?
springboot自動裝配原理
springboot啟動類都做了些什么
Spring Boot啟動類加載器

Mybatis

MyBatis體系結構與工作原理
Mybatis處理多個參數的幾種方式?
Mybatis占位符有幾種?區別是什么?
mybatis的緩存機制:一級緩存和二級緩存的區別
Mybatis如何開啟二級緩存?
Mybatis注解形式開啟二級緩存?
MyBatis 類型轉換器
mybatis接口沒有實現類,他是如何操作數據庫的?
Mybatis是如何和Mysql字段進行映射的?映射的三種方式?
Mybatis的常用注解有哪些

數據庫Mysql

數據庫行鎖和表鎖,存儲過程,函數
左連接、右連接和內連接的區別?
mysql中四種存儲引擎的區別和選擇
單個索引、聯合索引、主鍵索引 聯合索引(復合索引)和單個索引
什么是聚集索引? 主鍵就是聚集索引嗎?有什么區別?
數據庫自增主鍵可能的問題
[MySQL數據庫優化的八種方式(經典必看)
索引失效場景
簡單介紹下Mysql的索引類型
高並發下如何做到安全的修改同一行數據,樂觀鎖和悲觀鎖是什么
MySQL中樂觀鎖和悲觀鎖的具體實現方式
Mysql如何實現樂觀鎖
INNODB的行級鎖有哪2種,解釋其含義?
行級鎖包括共享鎖和排他鎖,具體實現的方式是什么?

Spring Cloud微服務

什么是springcloud?它有什么優勢?
springcloud和dubble的區別
SpringBoot和SpringCloud的區別
史上最簡單的 SpringCloud 教程系列,每個模塊的作用?如何使用?
服務雪崩、降級與熔斷

關於所做項目

支付系統設計中,如何防止重復支付?

算法

實現冒泡排序算法
實現快速排序算法
實現選擇排序算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM