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启动时创建,该内存区域存放了对象实例(包括基本类型的变量及 ...
随机推荐
- HTML5 画图--文字
1:html <div style="margin:0 auto;width:794px;height:1123px"> <canvas id="myC ...
- idea 码云 项目上传
1.点击导航栏 VCS -> Import into Version Control -> 托管项目到码云 2.输入码云帐号密码,点击login. 3.勾选private,点击托管按钮. ...
- RWIGS and LORBIT (1)
RWIGS and LORBIT 是两个与局域态密度或投影态密度相关的参数:RWIGS指的是Wigner–Seitz radius,LORBIT前面的LO指的就是Local. 这两个 ...
- np.identity()
二.np.identity()这个函数和之前的区别在于,这个只能创建方阵,也就是N=M 函数的原型:np.identity(n,dtype=None) 参数:n,int型表示的是输出的矩阵的行数和列数 ...
- 使用百度网盘配置私有Git服务
GitHub上免费的版本只能开源代码库,有时候需要配置些私有的服务,不方便公开.现在免费的网盘的容量越来越大,可以用来做存储的服务,如果只使用网盘存储合并代码很不方便,所以使用网盘+git 配置私有仓 ...
- 查看CPU序列号以及系统信息
CPU序列号 wmic cpu get processorid 现在也不唯一,比如联想同款机器,因为CPU批量生产,id也是一样 操作系统信息 systeminfo 查看硬件信息 dxdi ...
- MongoDB的基本shell操作(三)
mongodb_server_ Installer.bat @echo offecho 正在安装服务MongoDB...start cmd /k "cd/d C:\Program Files ...
- struts2框架之自定义拦截器和配置
struts框架中也存在拦截器,只不过系统自动调用.框架自带的拦截器的配置文件所在的位置为: java Resources--->Libraries--->struts2-core-2.3 ...
- jquery正则判断字符串有几个逗号
var angelweb="我,你,ta,";var re=/[,,]/g;if(re.test(angelweb)){ var n=angelweb.match(re).leng ...
- windows下用tcc编译Lua
脚本来源:Demon's Blog,http://demon.tw/software/compile-lua-with-tcc.html 版权归原作者所有 使用方法: 1.下载tcc编译器,本文解压目 ...