Java中的垃圾回收机制
1.垃圾回收的必要性
当对象被创建时,会在Java虚拟机中分配一块内存(内存分配-》默认值-》初始化值),在JVM的生命周期中,Java程序在不断地创建对象,如果这些对象的内存不被及时回收,会导致内存空间不足,因此要有一种措施及时回收无用对象的内存,保证内存能够被重复利用。
在传统的编程语言中,内存回收的工作由程序完成,程序显式地为对象分配内存,显式地回收,可能导致该回收的没有回收,不该回收的反而回收了。
2.java中的内存回收工作由JVM进程的一个称为垃圾回收器的系统级线程完成,它负责回收无用对象的内存,回收内存的过程成为垃圾回收。
3.垃圾回收的特点
a.只有当对象不再被任何变量引用时,它的内存才可能被回收;
b.程序无法迫使垃圾回收器立即执行垃圾回收操作
c.垃圾回收器在回收内存之前会调用finalize()方法,该方法有可能使对象复活,导致垃圾回收器取消回收该对象的操作。
4.从垃圾回收器的角度看对象的状态
a.可触及状态,只要程序中还有变量引用对象,该对象就处于可触及状态《此时垃圾回收器什么都不做》;
b.可复活状态,程序中没有变量引用对象,在这个状态中,垃圾回收器会准备释放对象占用的内存,释放之前,调用它的和其他处于可复活状态的对象的finalize()方法,这些finalize()方法会使对象重新回到可触及状态;
c.不可触及状态 当JVM执行完所有的finalize()方法,都不能使对象回到可触及状态时,对象就进入不可触及状态,这时,垃圾回收器会真正回收对象的内存
5.垃圾回收的时间
(1)程序只能够决定对象什么时候能够变为可复活状态,即在程序中不让任何变量引用该对象,但是程序无法决定垃圾回收器什么时候执行,即什么时候执行finalize()方法,什么时候让对象处于不可触及状态,什么时候回收对象的内存。
(2)对象生命周期:从对象被创建开始,一直到没有任何变量引用该对象。
(3)程序无法决定垃圾回收器什么时候回收无用对象的内存,垃圾回收器作为一个地优先级的线程独立运行,可以在程序中使用System
相关文档:
Publication and Escape 发布一个对象意味着能够从它能够从它当前范围之外被访问到。比如,保存可以被其他代码找到的这个对象的一个引用,或者将其作为一个非私有方法的返回值,或者将其作为参数传递给其它的类。 public static Set<Secret> knownSecrets;
public void initialize() {
knownSecrets = new Ha ......
http://www.java-cn.com/technology/tech/4759.html
偶尔在网上发现的一片关于掌握JAVA的标准,感觉有点意思,虽然在一些观点上有些偏颇,但作为学习JAVA的引导尚可。至于原创是谁没有必要考证。
时常看到一些人说掌握了Java,但是让他们用Java做一个实际的项目可能又困难重重,在这里, ......
JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据、JVM当前所有线程及其栈相关信息等
等。各种JDK自带的剖析工具,包括jps、jstack、jinfo、jstat、jmap、jconsole等,都是基于此API开发的。本篇对这部
分内容进行一个详细的说 ......
一. Incident
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
......
代码如下:
List <?> lines = FileUtils.readLines(new File(fileName));
for(Object line : lines){
}
问题:
1.List <?> 表示什么意思?
2.for括号内部的表达式是什么意思?
1、范型。表示lines中可保存任意类型
2、for-each 语句,作为for(int i=0;i<lines.length;i++){
Object line=lines.get(i ......