String,JVM,多線程面試知識點

String,StringBuffer,StringBulider區別
1、String是字符串常量,其他兩者是變量
    String拼接數值是不斷創建對象和JVM(GC)回收的過程,用“+”拼接,StringBuilder用append()方法
    從執行速度來說:StringBuilder>StringBuffer>String
     注意:String str1="a"+"b"比StringBuilder sb=new StringBuilder().append("a").append("b");速度快,因爲Str1等同於str1="ab"
2、StringBuffer中很多方法帶有synchronized關鍵字修飾,所以是線程安全的,StringBuilder方法沒有synchronized關鍵字修飾,所以是線程不安全的
總結:
     String:適用於少量字符串操作
     StringBuffer:適用於多線程大量字符串操作
     StringBulider:適用於單線程大量字符串操作
3、數據類型:
       基本數據類型:byte,short,int,long,char,float,double,boolean
       引用數據類型:類類型,接口類型和數組     
4、java中參數傳遞是值傳遞還是引用傳遞?
     程序運行都是在棧中執行,因此傳遞的是基本數據類型和對象的引用,不是對象本身。在運行棧中,傳遞的是基本數據類型和對象引用的值   
5、JVM:
    棧(stack):運行時的單位。存放的是基本數據類型和堆對象的引用(一個對象只對象大小爲4byte的引用)
              棧的大小通過-Xss來控制,當棧中存儲數據比較多時,需要適當調大這個值,否則會出現java.lang.StackOverflowError異常。
              常見的出現這個異常的是無法返回的遞歸,因爲此時棧中保存的信息都是方法返回的記錄點。
              -Xss規定了每個線程堆棧的大小。一般情況下256K是足夠了。影響了此進程中併發線程數大小。
    堆(heap):存儲的單位。存放的是對象(是動態變化的)
             new創建的對象的內存都在堆中分配,大小通過-Xmx(最大值)和-Xms(最小值)控制
    方法區(method):保存方法代碼(編譯後的java代碼)和字符表。存放了要加載的類信息,方法信息,靜態變量,final類型的常量、屬性。
                     JVM用持久代(Permanet Generation)來存放方法區,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值。
    本地方法棧(java中的jni調用):用於支持native方法的執行,存儲了每個native方法調用的狀態。
    垃圾回收機制:GC
                 堆裏聚集了應用程序創建的對象,JVM有對應的new,newArray然而沒有對應的delete,free指令。所以java的對象回收都是通過GC,GC除了回收內存之外,還有重要的工作就是內存壓縮
            對象引用的類型分爲:強引用,軟引用,弱引用和虛引用
                  強引用:就是平時寫的代碼,不會被垃圾回收
                  軟引用:作爲緩存來使用,回收機制會根據內存使用情況選擇是否被回收
                  弱引用:作爲緩存來使用,在進行垃圾回收時,一定會被回收,因爲它只存在於垃圾回收機制生命週期裏
            GC類型:Scavenge GC和Full GC
                       Scavenge GC:
                      一般情況下,當新對象生成,並且在Eden申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,並且把尚且存活的對象移動到Survivor區。
                      然後整理Survivor的兩個區。這種方式的GC是對年輕代的Eden區進行,不會影響到年老代。因爲大部分對象都是從Eden區開始的,同時Eden區不會分配的很大,所以Eden區的GC會頻繁進行。
                      因而,一般在這裏需要使用速度快、效率高的算法,使Eden去能儘快空閒出來。
                    Full GC:
                           對整個堆進行整理,包括Young、Tenured和Perm。Full GC因爲需要對整個對進行回收,所以比Scavenge GC要慢,因此應該儘可能減少Full GC的次數。
                           在對JVM調優的過程中,很大一部分工作就是對於FullGC的調節。
                           有如下原因可能導致Full GC:
                                1· 年老代(Tenured)被寫滿
                                2· 持久代(Perm)被寫滿 
                                3· System.gc()被顯示調用 
                                4·上一次GC之後Heap的各域分配策略動態變化                    
    總結: 
        堆棧分離的原因:
                      1、棧代表處理邏輯,堆代表數據。
                      2、棧和堆的分離,使得堆中的數據被多個棧共享(多線程訪問同一個對象),內存共享,節省空間。
                      3、棧只能向上增長,堆中的對象根據需要動態增長,從而實現了動態增長,棧中只需記錄堆的地址即可。
                      4、面向對象就是堆和棧的完美結合。比如:對象的屬性就是數據,放在堆裏。對象的方法(行爲)就是運行邏輯,放在棧中。
        聲明一個Object對象(即Object ob=new Object())需要在堆內的空間大小爲4byte(棧引用大小)+8byte(對象堆中大小)
        
        
6、java對象的生命週期:
                  創建——應用——不可見——不可達——收集——終結——對象空間重分配
                  
7、在Hibernate中,持久化對象在操作過程中可以分爲三個時期,這三個時期是與Session的週期相關的,因爲Hibernate中的操作都是基於Session完成的。
   所以Session對象的生命週期也關係着持久化對象的生命週期。
   持久化對象的三種生命週期分別是:
           1、瞬時態(Transient):剛創建的對象,還沒有被session管理
           2、持久態(Persistent):被session管理,並且對應數據庫有一條數據
           3、脫管態(Detached):脫離session管理
8、線程:
       創建線程的方法:繼承Thread類和實現Runnable接口
       生命週期:新建——就緒——運行——阻塞——死亡

 

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