深入理解JVM——关于垃圾回收
关于垃圾回收
仿佛来自上海居委会大妈的灵魂拷问:“你是什么垃圾?”
不
今天我们要说的是JVM的垃圾回收
假如我是一个“人”类的“对象”,也和人的生命一样必有一死,可是“我真的还想再活500年~~”,面临着GC(垃圾回收器)这个“死神”,我可以逃脱命运的摆布吗?我应该如何逃脱呢?
其实是可以的,就是有名的finalize 大法(以前黑客常用的方法之一),下面代码演示一下:
/**
此代码演示:
1、对象可以在被GC时自救
2、这种自救的机会只有一次,因为一个对象的finalize()方法最多只会自动被系统调用一次
**/
public class FinalizeEscapeGC{
public static FinalizeEscapeGC SAVE_HOOK=null;
public void isAlive(){
System.out.println("yes,i am still alive :)");
}
@override
protected void finalize() throws Throwable{
super.finalize();
System.out.println("finalize method executed!");
FinalizeEscapeGC.SAVE_HOOK=this;
} public static void main(String[] args)throws Throwable{
SAVE_HOOK=new FinalizeEscapeGC();
//对象第一次成功拯救自己
SAVE_HOOK=null;
System.gc();
//因为 finalize 方法优先级很低,所以暂等0.5秒
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println("no,i am dead :(");
} //这一次自救失败了,因为 finalize 方法只会调用一次哦
SAVE_HOOK=null;
System.gc();
//因为 finalize 方法优先级很低,所以暂等0.5秒
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println("no,i am dead :(");
}
}
}
注意,为了演示的理解性,2次自救代码是一样的
运行情况:
finalize method executed!
yes,i am alive :)
no,i am dead :(
第一次自救成功!!
第二次自救失败。。。
分析:
通过 finalize 这个门槛,我们可以逃脱,但是系统只会自动调用一次,所以要是在来一次就无法逃脱了。
但是 finalize 方法代价高昂,系统运行消耗内存资源,所以尽量不要使用。他可不是C/C++中的析构函数,只是当初为了让C程序员接受java的一个妥协。
所以,忘了他吧。
深入理解JVM——关于垃圾回收的更多相关文章
- 深入理解JVM一垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...
- 深入理解JVM(五) -- 垃圾回收算法
上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...
- 理解JVM之垃圾回收
1.垃圾收集算法 1) 标记-清楚算法:该算法是最基础的收集算法,其分为标记与清除两个阶段.首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,该算法主要有两个不足:一个是效率问题,标 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM虚拟机—JVM的垃圾回收机制(转载)
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- JVM(九):垃圾回收算法
JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...
- 2.1.JVM的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
随机推荐
- 在Windows平台搭建C语言开发环境
一.在Windows平台搭建DEV C++集成开发环境 官网 https://sourceforge.net/projects/orwelldevcpp/ 中下载Dev C++运行即可 环境准 ...
- table固定宽度与自动宽度
table-layout:auto(创建的table默认是此布局模式): 对table和td.th指定的宽度无效,浏览器会计算所有单元格的内容宽度才能得出一列宽度 如果想对单元格的内容自动折行需使用w ...
- Nginx 之 Rewrite 规则
write 规则介绍 Rewite 规则作用 Rewrite规则可以实现对url的重写,以及重定向 作用场景: URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 SEO优化 维护:后台 ...
- nginx的proxy模块详解以及参数
文章来源 运维公会:nginx的proxy模块详解以及参数 使用nginx配置代理的时候,肯定是要用到http_proxy模块.这个模块也是在安装nginx的时候默认安装.它的作用就是将请求转发到相应 ...
- linux防火墙(一)
安全技术 入侵检测与管理系统IDS(Intrusion Detection Systems):特点是不阻断任何网络访问,量化.定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指 ...
- 模板引擎-vue中的模板如何被解析,指令如何处理
模板是什么 <div id='app'> <div> <input v-model="title"/> <button v-on:clic ...
- kali系统无法使用ll命令
ll命令:也就是ls -l的缩写方式. 重装kali系统之后,发现无法使用ll命令了,于是写一个笔记记录一下如何添加ll命令. 解决方法: vim ~/.bashrc 将alias ll=’ls -l ...
- 基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类
基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...
- 回调函数(callback)
回调函数(callback) A "callback" is any function that is called by another function which takes ...
- H5--性能测试(PageSpeed Insights )
中文网站(不需要翻墙): http://www.googlespeed.cn 主要可实现: 1.测试手机与电脑打开的速度对比. 2.详细的测试结果 3.直观的统计数据,查看页面的共xx个请求.总共大小 ...