java 之 对象与垃圾回收
1.垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(如数据库连接,网络IO等资源)
2.程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久的失去引用后,系统会在合适的时间回收其占用的内存。
3.在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法。
对象在内存中的状态:
可 达 状 态:当一个对象被创建后,若有一个以上的引用变量引用他,则这个对象在程序中处于可达状态,程序可通过引用变量来调用该对象的实例变量和方法。
可恢复状态:如果程序中某个变量不在有任何引用变量引用它,它就进入了可恢复状态。在这种状态下,垃圾回收机制会准备回收这个变量所对应的内存,在回收该对象之前,系 统会调用所用可恢复对象的fnalize()方法,如果此时有一个引用变量引用该对象,该对象就重新变为可达状态。
不可达状态:当对象和所用引用变量的联系被切断,且系统已经调用了该对象的finalize()方法,仍没有使该对象变为可达状态。此时该对象进入不可达状态,只有当对象处于不可达状态时,系统才会开始回收该对象占用的资源。
public class StatusTranfer{
public static void test(){
//执行此步时,对象12345处于可达状态
String a = new String("12345");
//执行到此步时,对象12345处于可恢复状态
//对象123处于可达状态
a = new String("123");
}
public static void main(String[] args) {
test();
}
}
强制垃圾回收
程序只能控制一个对象什么时候不被引用变量引用,但不能控制系统什么时候进行垃圾回收。
程序无法精确控制java垃圾回收的时机,但仍然能够强制系统进行垃圾回收————这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收仍然不确定。大部分时候,程序强制系统进行垃圾回收会有一些效果。
强制垃圾回收的两种方式:
1。调用System类的gc()静态方法: System.gc()
2.调用Runtime的gc()实例方法:Runtime.getRuntime().gc()。
java 之 对象与垃圾回收的更多相关文章
- Java学习笔记-对象与垃圾回收
Java存在垃圾回收机制,JVM会去回收垃圾,释放资源,而不是像C++一样有程序员去完成 垃圾回收机制的特点 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接.网络IO等资源 ...
- java面试问题整理-垃圾回收
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的" ...
- Java内存管理 -JVM 垃圾回收
版权声明:本文为博主原创文章,未经博主允许不得转载 一.概述 相比起C和C++的自己回收内存,JAVA要方便得多,因为JVM会为我们自动分配内存以及回收内存. 在之前的JVM 之内存管理 中,我们介绍 ...
- Java基础教程:垃圾回收
Java基础教程:垃圾回收 垃圾回收 垃圾回收(Garbage Collection,GC),顾名思义是释放垃圾占用的空间,防止内存泄漏.有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使 ...
- 《深入理解 Java 虚拟机》学习 -- 垃圾回收算法
<深入理解 Java 虚拟机>学习 -- 垃圾回收算法 1. 说明 程序计数器,虚拟机栈,本地方法栈三个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性 Java 堆和方 ...
- Java其实不支持垃圾回收
Java其实不支持垃圾回收.如果真的支持的话,大多数Java程序在运行的一开始就应该把程序本身删除,因为这些程序本身就是垃圾. // TODO: This is a 分割线. Please no ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- Java内存模型与垃圾回收
1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法 ...
- Java基础-gs(垃圾回收)
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 ...
随机推荐
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 下载最新Android代码的方法
之前我是去Android官方网站下载最新Android代码,但是这种方法需要FQ,而且有时候FQ又不太方便,今天我发现一个不错的网站,是清华大学搞的,跟Android官方的代码基本保持同步,而且下载方 ...
- EB-SAM9G45裸机程序下载方法
开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...
- iOS-定时器
一.定时器的作用 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 二.定时器的种类 大概有三种方法:NSTimer.CA ...
- Windows平台下ActiveMQ 安装
安装之前需要先确定机器上已经有JVM环境,如果没有则会在安装过程中提示 Unable to execute Java command. 系统找不到指定的文件 第一步:从官网下载ActiveMQ的安装 ...
- mysql主从复制显示正常,数据没同步现象。
当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...
- 第一个sprint心得及感想
经过两个星期的努力,第一个周期的任务终于完成,通过这次团队协作,学到了很多东西,首先是把任务细分化,把大的任务分为每天完成,然后团队个人都有自己的任务份额,这样子就不会全压在一个人身上.还有就是学会了 ...
- 一个Linq表达式的扩展函数帮助类
/// <summary> /// Linq表达式的扩展函数 /// </summary> public static class ExpressionExtensions { ...
- 在SQL存储过程中给条件变量加上单引号
在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) ), )), )+ ...
- js验证电话号码的正则表达式
在做程序时遇到js验证电话号码的问题,使用正则表达式来操作很简单的.一起来看一下吧. 1,这种是比较简单的验证号码: 电话号码只能包含”(“.“)”.“-”和数字 <input type=t ...