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回收机制回收掉了!
.........