天天看點

面試問題1、 類加載的三種方式2、擷取Class對象的三種方式JAVA反射機制3 如何判斷對象已死

1、 類加載的三種方式

1:指令行啟動應用時由JVM初始化加載

2:通過Class.forName() 方式動态加載

3:通過ClassLoder.loadClass() 方法動态加載

2、擷取Class對象的三種方式

1.1 Object ——> getClass();

1.2 任何資料類型(包括基本資料類型)都有一個“靜态”的class屬性

1.3 通過Class類的靜态方法:forName(String  className)(常用)

  Student stu1 = new Student();//這一new 産生一個Student對象,一個Class對象。 
        Class stuClass = stu1.getClass();//擷取Class對象 
        System.out.println(stuClass.getName());  
 //第二種方式擷取Class對象 
        Class stuClass2 = Student.class;  
        System.out.println(stuClass == stuClass2);//判斷第一種方式擷取的Class對象和第二種方式擷取的是否是同一個 
 //第三種方式擷取Class對象 
 try {  
            Class stuClass3 = Class.forName(”fanshe.Student”);//注意此字元串必須是真實路徑,就是帶包名的類路徑,包名.類名 
            System.out.println(stuClass3 == stuClass2);//判斷三種方式是否擷取的是同一個Class對象 
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        }             

複制

JAVA反射機制

是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制

3 如何判斷對象已死

(1:引用計數法(java中沒用,因為,沒辦法解決循環引用:A引用B,B也引用A,但是沒有其他引用去引用A和B,這時AB都是垃圾,但是引用計數法無法判斷)。2:可達性分析算法:通過GC Roots為起始點向下搜尋,說白了就是通過你已知的活對象,去找這對象裡的引用,再找引用對象裡的引用,一直這樣下去,找的到的就是活的。那麼哪些對象可以作為GC Roots呢:1虛拟機棧中引用的對象。2方法區靜态屬性引用的對象。3方法區中常量引用的對象。4本地方法棧中JNI(一般說的是Native方法)引用的對象)

4 常見的垃圾回收算法(1标記清除:通過可達性分析算法标記好活對象,然後清除掉沒标記得對象,有個缺點:空間很零碎是以有了标記整理算法。2複制算法:同樣是可達性分析後,活對象呢就直接複制到一片新記憶體中,之前的記憶體中所有對象直接清除,優點是沒有零碎空間産生,但是消耗了很大記憶體。3标記整理算法:先标記清除再整理。4分代算法:這裡分代是将堆裡的對象進行分代,比如螞蟻爺爺屬于老年代,剛出生的螞蟻孩子屬于新生代等,分完代後呢 其實沒有自己的算法,用的都是前面說的算法,但是分代特點是:不同的代,用合适自己的算法 比如:新生代很多對象都是很快消亡是以用複制算法,老年代裡的對象都是存活率高的用:标記清除或标記整理)

5 JVM常見的指令工具包括(jps用于查詢正在運作的JVM程序。 jstat可以實作顯示本地或遠端JVM程序中類加載、記憶體、垃圾回收、JIT編譯等資料。 jinfo用于查詢目前運作着的JVM屬性和參數的值。 jmap用于顯示目前堆永久代的詳細資訊。 jhat 用于分析使用jmap生成的dump檔案,是JDK自帶的。 jstack用于生成目前線程的所有快照,用于定位線程長時間出現停頓的原因)

6 重寫equals方法要遵循哪些通用的約定(自反性:x.equals(x)要成立。對稱性:x.equals(y) 和y.equals(x)要成立。傳遞性:x、y、z x.equals(y) 和y.equals(z)成立 那x.equals(z)要成立。一緻性:說白點就是隻要進行equals的對象不變,那麼結果就一直不能變。非空性:對于任意非空引用x,x.equals(null)應該傳回false)

7 關鍵字transient(簡單地說,就是讓某些被修飾的成員屬性變量不被序列化。transient不能修飾類和方法,被transient關鍵字修飾的變量不能被序列化,一個靜态變量不管是否被transient修飾均不能被序列化。)

8 redis的持久化方式中 RDB方式優缺點(RDB:是指用資料集快照的方式記錄redis資料庫的所有鍵值對 優點:1.隻有一個檔案 dump.rdb 友善持久化。2.容災性好,一個檔案可以儲存到安全磁盤。3.性能最化,fork子程序來完成寫操作,讓主程序繼續處理指令。4.相對于資料集大時,比AOF啟動效率高。缺點:資料安全性較低)

9 redis的持久化方式中AOF方式優缺點(AOF:是指所有的指令行記錄以redis,指令請求協定的格式儲存為aof檔案 優點:資料安全,通過append模式寫檔案,即使中途伺服器當機可以通過redis-check-aof工具解決資料一緻性問題。3AOF機制的rewrite模式。缺點:1檔案比RDB形式檔案大。2資料集大比RDB啟動效率低)

10 講解一下HTTP請求裡的Header有什麼作用(accept:浏覽器端可以接受的媒體類型。Accept-Encoding: 浏覽器申明自己接收的編碼方法。Accept-Language:浏覽器申明自己接收的語言。Connection:連接配接狀态,close 的話就要新開連接配接。Host:請求報頭域主要用于指定被請求資源的Internet主機和端口号。User-Agent:告訴HTTP伺服器, 用戶端使用的作業系統和浏覽器的名稱和版本。)

11 linux中grep的使用(用于過濾/搜尋的特定字元、如:grep "qqq\|aaa" abc.txt 是把qqq和aaa從abc.txt中篩選出來,grep "q" abc.txt 把小q篩選出來 ,如grep -i "q" abc.txt這樣就不區分大小寫了 ,還有很多參數以及正規表達式,不太明白的童鞋百度哦)