Android-JVM中的多線程&垃圾回收

Java語言是爲數很少支持多線程技術的編程語言,而這多線程就不得不提到JVM虛擬機

 

先看代碼案例:(JVM收垃圾)

package android.java.thread; class Demo { /** * 此方法是Object最終父類提供的方法 * 此方法能夠得到當前Demo被JVM回收機制回收掉了 * @throws Throwable */ @Override protected void finalize() throws Throwable { // super.finalize();
        System.out.println("Demo finalize 方法 我被JVM回收機制回收掉了!"); } } public class Test { public static void main(String[] args) { System.out.println("main 方法 開始執行"); new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收 // 調用回收機制來回收,調用了gc(); 會不會立刻回收 這個不肯定,這個是隨機性的
 System.gc(); System.out.println("main 方法 執行完畢!"); } }

日誌打印結果:

第一次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!java

第二次執行結果:android

main 方法 開始執行
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
main 方法 執行完畢!編程

第三次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!多線程

通過以上三次執行結果能夠看出,每次JVM回收機制回收掉哪些Demo是不同的,這個是JVM內部的隨機性(應該說是內部的處理)  

通過以上代碼能夠看出,至少有兩個線程在跑:注意⚠️實際上有不少線程在跑,這是Java內部在處理的,但至少有如下兩個線程在跑

    1.main主線程,負責執行自定義代碼;-->  線程1編程語言

    2.JVM回收機制線程,負責回收垃圾;--->線程2ide

    


 

 

案例:(匿名對象 與 引用對象) 回收機制

package android.java.thread; class Demo2 { /** * 此方法是Object最終父類提供的方法 * 此方法能夠得到當前Demo被JVM回收機制回收掉了 * @throws Throwable */ @Override protected void finalize() throws Throwable { // super.finalize();
        System.out.println("Demo finalize 方法 我被JVM回收機制回收掉了!"); } } class Student { /** * 此方法是Object最終父類提供的方法 * 此方法能夠得到當前Demo被JVM回收機制回收掉了 * @throws Throwable */ @Override protected void finalize() throws Throwable { // super.finalize();
        System.out.println("Student finalize 方法 我被JVM回收機制回收掉了!"); } } public class Test2 { public static void main(String[] args) { System.out.println("main 方法 開始執行"); new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
        new Demo(); // 建立匿名對象,只在堆內存開闢空間,因爲此對象沒有引用 這個匿名對象 會被JVM優先回收
 Student student1 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student2 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student3 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student4 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student5 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student6 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student7 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student8 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student9 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student10 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student11 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student12 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student13 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收
        Student student14 = new Student(); // 建立引用對象,在棧內存/堆內存開闢空間,因爲此對象有引用,JVM會檢測後處理後纔回收 // 調用回收機制來回收,調用了gc(); 會不會立刻回收 這個不肯定,這個是隨機性的
 System.gc(); System.out.println("main 方法 執行完畢!"); } }

第一次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!spa

第二次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!線程

第三次執行結果:

main 方法 開始執行
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
main 方法 執行完畢!日誌

第四次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!code

第五次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!

第六次執行結果:

main 方法 開始執行
main 方法 執行完畢!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!
Demo finalize 方法 我被JVM回收機制回收掉了!

 

.........

以上執行結果 執行了六次也沒有出現,Student被回收,說明Student是引用對象,JVM回收機制回收優先級很低(JVM要作不少檢測,來判斷Student)

相關文章
相關標籤/搜索