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启动时创建,该内存区域存放了对象实例(包括基本类型的变量及 ...
随机推荐
- Django入门-简单的登录
1.登录页面 2.项目目录结构 3.需要修改四个文件 urls.py-------路径与函数之间的对应关系 views.py-------函数定义与逻辑处理 加入一个login.html文件 ...
- mysql优化连接数
很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...
- go语言中make和new的区别
make用于内建类型(map.slice 和channel)的内存分配.new用于各种类型的内存分配. 内建函数new本质上说跟其他语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空 ...
- 3.Longest Substring Without Repeating Characters(string; HashTable)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- SVN概述
----------------------siwuxie095 SVN 概述 1.SVN 即 Subversion 的 ...
- fckeditor 数据库 取值 显示
用fckeditor把html代码存到数据库中,取出来显示的时候用什么控件呢?用Literal 或 Label 控件.
- js深拷贝、浅拷贝
浅拷贝: 只针对当前对象的属性进行拷贝,若当前对象的属性是引用类型时,这个不考虑,不进行拷贝.若属性是引用类型,拷贝后引用的是地址,如果进行更改,会影响拷贝的原对象属性. 深拷贝:针对当前对象的数据的 ...
- [z]Windows 下基于 Eclipse 的可视化远程 Linux C/C++ 开发环境搭建
http://blog.csdn.net/lostaway/article/details/8086056 1.简介 Windows 下远程 Linux 开发工具,比较著名的就是 WinGDB 和 M ...
- Python发送邮件不需要发件人密码认证
#!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list ...
- js如何切割字符串
<script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...