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回收机制回收掉了!
第二次执行结果:
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回收机制线程,负责回收垃圾;--->线程2
案例:(匿名对象 与 引用对象) 回收机制
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回收机制回收掉了!
第二次执行结果:
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回收机制回收掉了!
第五次执行结果:
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)
Android-JVM中的多线程&垃圾回收的更多相关文章
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- 程序猿的日常——JVM内存模型与垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- JVM内存模型和垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- JVM架构和GC垃圾回收机制详解
JVM架构图分析 下图:参考网络+书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看:Hadoop内存溢出(OOM)分类.参数调优化) JVM被分为三个主要的子系统 (1)类加载器子系统(2)运行 ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- JVM内存管理和垃圾回收机制介绍
http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...
- JVM系列之五:垃圾回收
. jdk1.7的堆内存 1. 堆(Java堆) 堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域, 在JVM启动时创建,该内存区域存放了对象实例(包括基本类型的变量及 ...
随机推荐
- dubbo dubbo.xsd 报错
构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wil ...
- Python3 bytes 函数
Python3 bytes 函数 Python3 内置函数 描述 bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列.它是 b ...
- 56. Merge Intervals (Array; Sort)
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- PAT L2-010 排座位(floyd)
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...
- 类实现Parcelable接口在Intent中传递
类实现了Parcelable接口就可以在Intent中传递 只要在类的定义中实现Parcelable接口 代码 package entity; import android.os.Parcel; ...
- php iframe 上传文件
我们通过动态的创建iframe,修改form的target,来实现无跳转的文件上传. 具体的实现步骤 1.捕捉表单提交事件 2.创建一个iframe 3.修改表单的target,指向iframe ...
- struts2框架值栈的概述之问题一:什么是值栈?
1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...
- Mina入门:mina版之HelloWorld[z]
Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...
- iOS.ObjC.Basic-Knowledge
1. ObjC的基础 2. ObjC2.0中的编译指令 3. ObjC Runtime 4. ObjC Object Model 5. ObjC的新语法 6. FQA 1. ObjC的基础 2. Ob ...
- mysql水平分区
解决问题:单表数据量过大 ALTER TABLE boc_url_log PARTITION BY RANGE (ulid) ( PARTITION log_1 VALUES LESS THAN () ...