`
frenchmay
  • 浏览: 228846 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入java虚拟机第9章, 垃圾收集(1)

阅读更多

java虚拟机的堆里存放着正在运行的java程序所创建的所有对象。当一个对象不再被程序引用时,它所使用的堆空间可以被回收,以便后续的新对象所使用。垃圾收集器必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。在释放不再被引用的对象的过程中,垃圾收集器运行将要被释放的对象的终结方法(finalizer)。

除了释放不再被引用的对象,垃圾收集器还要处理堆碎片。在一个虚拟内存系统中,增长的堆所需要的额外分页(或交换)空间会影响运行程序的性能。

 

垃圾收集

垃圾收集算法要做两件事情

1) 检测出垃圾对象

2)回收垃圾对象所使用的堆空间并还给程序

 

垃圾检测通常通过建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现。如果正在执行的程序可以访问到的根对象和某个对象之前存在引用路径,这个对象就是可触及的。对于程序来说,根对象总是可以访问的。从这个根对象开始,任何可以被触及的对象都被认为是活动对象。无法被触及的对象被认为是垃圾,因为它们不在影响程序的执行。

 

java虚拟机的根对象集合根据实现而不同,但是总会包含局部变量中的对象引用和栈帧的操作数栈(以及类变量中的对象引用)。另一个根对象的来源是被加载的类的常量池中的对象引用,比如字符串。还有一个来源是传递到本地方法中的,没有被本地方法释放的对象引用。另一个潜在的根对象的来源是,java虚拟机运行时数据区中从垃圾收集器的堆中分配的部分。

 

区分活动对象和垃圾的两个基本方法是引用计数和跟踪。

引用计数垃圾收集器通过为堆中的每一个对象保存一个计数来区分活动对象和垃圾对象。这个计数记录下了对那个对象的引用次数。

跟踪垃圾收集器实际上追踪从根结点开始的引用图。在追踪中遇上的对象以某种方式打上标记,当追踪结束时,没有被打上标记的对象就是被断定是不可触及的,可以被当作垃圾收集。

 


java程序的退出有两种机制:一种是程序运行完成,自然退出.另一种是抛出异常或者错误退出.

//因此当主线程启动一个子线程,并且主线程以以上任何一种方式退出后.

子线程是否继续执行取决于这个线程是用户线程还是守护线程.如果该子线程是用户线程,该子线程会继续执行.
如果该子线程是守护线程,该子线程会终结.//

//这里写得有问题

应该是java程序启动一个线程,并且java程序以以上任何一种方式退出后.

在主线程退出,在jvm退出之前.jvm会判断当前的进程.

如果在没有用户进程(有或没有守护线程)的情况下,jvm会退出

该线程是否继续执行取决于这个线程是用户线程还是守护线程.如果该线程是用户线程,该线程会继续执行.
如果该线程是守护线程,该线程会终结.

 

分享到:
评论
5 楼 frenchmay 2009-01-04  
taga 写道
“如果是守护线程,该子线程会终结. ”
为什么??

在主线程退出,在jvm退出之前.jvm会判断当前的进程.

如果在没有用户进程(有或没有守护线程)的情况下,jvm会退出

该线程是否继续执行取决于这个线程是用户线程还是守护线程.如果该线程是用户线程,该线程会继续执行.
如果该线程是守护线程,该线程会释放.
4 楼 frenchmay 2009-01-04  
maoxiaolu2000 写道
如果主线程意外中断了,他它开启的其它线程,在虚拟机没有结束进程的情况下,是不是永远不会被释放。


在主线程退出,在jvm退出之前.jvm会判断当前的进程.

如果在没有用户进程(有或没有守护线程)的情况下,jvm会退出

该线程是否继续执行取决于这个线程是用户线程还是守护线程.如果该线程是用户线程,该线程会继续执行.
如果该线程是守护线程,该线程会释放.
3 楼 taga 2009-01-04  
“如果是守护线程,该子线程会终结. ”
为什么??
2 楼 frenchmay 2009-01-04  
maoxiaolu2000 写道

如果主线程意外中断了,他它开启的其它线程,在虚拟机没有结束进程的情况下,是不是永远不会被释放。

java程序的退出有两种机制:一种是程序运行完成,自然退出.另一种是抛出异常或者错误退出.

因此当主线程启动一个子线程,并且主线程以以上任何一种方式退出后.
子线程是否继续执行取决于这个线程是用户线程还是守护线程.如果该子线程是用户线程,该子线程会继续执行.
如果该子线程是守护线程,该子线程会终结.
1 楼 maoxiaolu2000 2009-01-04  
如果主线程意外中断了,他它开启的其它线程,在虚拟机没有结束进程的情况下,是不是永远不会被释放。

相关推荐

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

    深入JAVA虚拟机第二版.pdf 目录

    译者序 前言 第1章 Java体系结构介绍 ...第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句

    深入Java虚拟机(原书第2版)及书中源代码

    第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 ...

    深入java虚拟机中文第2版

    第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 ...

    深入java虚拟机第二版

    深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...

    深入java虚拟机

    第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 ...

    深入Java虚拟机

    第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 ...

    深入JAVA虚拟机(第2版)

    第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 ...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第9节Java技术体系00:08:46分钟 | 第10节jdk8的新特性00:07:31分钟 | 第11节lanmbda表达式简介00:07:02分钟 | 第12节Java虚拟机-classic vm00:06:06分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java...

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    前 言 致 谢 第一部分 走近Java 第1章 走近Java / 2 1.1 概述 / 2 1.2 Java技术体系 / 3 1.3 Java发展史 / 5 1.4 展望Java技术的未来 / 9 1.4.1 模块化 / 9 1.4.2 混合语言 / 9 1.4.3 多核并行 / 11 ...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第9讲 Java技术体系 00:08:46  第10讲 jdk8的新特性 00:07:31  第11讲 lanmbda表达式简介 00:07:02  第12讲 Java虚拟机-classic vm 00:06:06  第13讲 Java虚拟机-ExactVM 00:03:35  第14讲 Java虚拟机-...

    张孝祥Java就业培训教程.pdf

    1.1 Java虚拟机及Java的跨平台原理 1.2 Java开发环境的搭建 1.3 体验Java编程的过程 1.4 classpath的设置 1.5 有效利用Java的文档帮助 1.6 JVM(虚拟机)的运行过程 1.7 垃圾回收器 1.8 反编译工具的介绍 第2章 Java...

Global site tag (gtag.js) - Google Analytics