近期面試題總結【四】

晨星準備

  • gc是什麼,他的原理是什麼,回收機制判斷沒有引用對象時算法是什麼

    https://www.cnblogs.com/wjtaigwh/p/6635484.html
  • lock,synchronized的區別

    1.首先synchronized是java內置關鍵字,在jvm層面,Lock是個java類;

    2.synchronized無法判斷是否獲取鎖的狀態,Lock可以判斷是否獲取到鎖;

    3.synchronized會自動釋放鎖(a 線程執行完同步代碼會釋放鎖 ;b 線程執行過程中發生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;

    4.用synchronized關鍵字的兩個線程1和線程2,如果當前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結束了;

    5.synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可)

    6.Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。

  • spring beanfactory factorybean有什麼區別
    beanFactory是一個Factory,用於管理bean的,有了一個Spring的beanFactory,我們就可以從spring中
    獲取註冊到其中的bean來使用了

    FactoryBean的功能貌似更像是一種代理,有一種場景是,我們使用一個通用的類來在xml文件中註冊bean,我們希望通過該通用bean產生一個我們希望的bean,而這個需求FactoryBean就可以辦到,你只需要攔截你需要代理的bean,然後轉換成你希望的bean再註冊。一個應用場景就是Rpc服務器端的bean註冊,以及Rpc客戶端的服務調用,都可以通過一個第三方bean來產生我們真正需要的bean。

    https://www.jianshu.com/p/a8036f3cc1e6
  • jms, activemq發送消息,消息丟失時怎麼處理
  • nio有用過嗎,用過裏面的什麼方法 byte channel
  • Mybatis映射是如何實現的
  • 接口和抽象類的區別,什麼情況下一定要用接口,什麼情況下用抽象類
  • 多線程通信

    很詳細
    https://www.cnblogs.com/java1024/p/7685400.html

    進程間的通信方式

    管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。
        有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信。
    信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。
        消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
        信號 ( sinal ) : 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。
        共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
        套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信

  • 頁面訪問慢怎麼處理
    1.用緩存,memcached,ehcached
    2.頁面的靜態化
    3.sql優化,數據庫優化
    4.服務器集羣,負載均衡
    5.準備圖片服務器
  • 堆跟棧有什麼區別
  • uml畫兩個類的一對多關係
     
  • character與bytes有什麼不同
    A) 每次讀入的字節數不同 B) 前者帶有緩衝,後者沒有
    C) 前者是字符讀寫,後者是字節讀寫 D) 二者沒有區別,可以互換使用
    https://www.cnblogs.com/skipping/p/5429139.html
  • springframework 可以跨平臺,反射
    java編譯後變成class文件,字節碼文件,通過字節碼反射實現springframework框架
  • 爲什麼java支持write once, run everywhere

    Java虛擬機不和包括Java在內的任何語言綁定,它只與“Class 文件”這種特定的二進制文件格式所關聯,Class文件中包含了Java虛擬機指令集合符號表以及若干其他輔助信息。

    這裏寫圖片描述

  • 數組跟鏈表有什麼區別,什麼情況下用數組,什麼情況下用雙向鏈表

    數組:是將元素在內存中連續存儲的;它的優點:因爲數據是連續存儲的,內存地址連續,所以在查找數據的時候效率比較高;它的缺點:在存儲之前,我們需要申請一塊連續的內存空間,並且在編譯的時候就必須確定好它的空間的大小。在運行的時候空間的大小是無法隨着你的需要進行增加和減少而改變的,當數據兩比較大的時候,有可能會出現越界的情況,數據比較小的時候,又有可能會浪費掉內存空間。在改變數據個數時,增加、插入、刪除數據效率比較低。

    鏈表:是動態申請內存空間,不需要像數組需要提前申請好內存的大小,鏈表只需在的時候申請就可以,根據需要來動態申請或者刪除內存空間,對於數據增加和刪除以及插入比數組靈活。還有就是鏈表中數據在內存中可以在任意的位置,通過應來關聯數據(就是通過存在元素的指針來聯繫)。

    數組和鏈表就拿增加數據來說,數組中增加一個元素,需要移動大量的元素,在內存中空出一個元素的空間,然後將增加的元素放到空出的空間中;而鏈表就是將鏈表中最後的一個元素的指針指向新增的元素,在指出新增元素是尾元素就好了。

    數組場景:

    1、數據比較少;

    2、經常做的運算是按序號訪問數據元素;

    3、數組更容易實現,任何高級語言都支持;

    4、構建的線性表較穩定。

  • linkedlist是雙向鏈表實現的,爲什麼查詢效率慢
  • 英文自我介紹
  • 多線程的pipedStream RandomAcceStream FileStream Filter stream
  • C++和java的區別
    https://www.cnblogs.com/Allen-rg/p/6692043.html
  • 不用臨時變量,交換變量a和b值的方法,哪種最案例,爲什麼
  • springMVC與struts2的區別
  • (C++)HTTP CODE
  • (C++)設計模式,敏捷開發

  • Java運行時數據區:
  1. 程序計數器
    是用於存儲每個線程下一步將執行的jvm指令,如該方法爲native的,則程序計數器中不存儲任何信息
  2. jvm棧
    jvm棧是線程私有的,每個線程創建的同時都會創建jvm棧,jvm棧中存放的爲當前線程中局部基本類型變量,部分返回結果以及stack frame,非基本類型對象在jvm棧上僅存放一個指向堆上的地址
  3. 它是JVM用來存儲對象實例以及數組值的區域,可以認爲Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收。

      (1)堆是JVM中所有線程共享的,因此在其上進行對象內存的分配均需要進行加鎖,這也導致了new對象的開銷是比較大的

      (2)Sun Hotspot JVM爲了提升對象內存分配的效率,對於所創建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此JVM在給線程的對象分配內存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配

      (3)TLAB僅作用於新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。

  4. 方法區(Method Area)

      (1)在Sun JDK中這塊區域對應的爲PermanentGeneration,又稱爲持久代。

      (2)方法區域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義爲final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數據都來源於方法區域,同時方法區域也是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。

  5. 本地方法棧(Native Method Stacks)

      JVM採用本地方法棧來支持native方法的執行,此區域用於存儲每個native方法調用的狀態。

  6. 運行時常量池(Runtime Constant Pool)

      存放的爲類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區域中分配。JVM在加載類時會爲每個class分配一個獨立的常量池,但是運行時常量池中的字符串常量池是全局共享的。

  • String,StringBuffer,StringBuilder
    StringBuffer是線程安全的,每次操作字符串,String會生成一個新的對象,而StringBuffer不會;StringBuilder是非線程安全的
  • 四種線程池
    newCachedThreadPool——創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
    newFixedThreadPool——創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
    newScheduledThreadPool——創建一個定長線程池,支持定時及週期性任務執行。
    newSingleThreadExecutor——創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

  • 當一個線程進入一個對象的synchronized方法A之後,其他線程是否可進入此對象的synchronized方法B?
    給出答案:

         是不能的,其他線程只能訪問該對象的非同步方法,同步方法則不能進入;

         因爲非靜態方法上的synchronized修飾符要求執行方法時要獲得對象的鎖,如果已經進入A方法,說明對象鎖已經被取


 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章