深入理解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的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
随机推荐
- springboot笔记02——快速入门quickstart
前言 学习一个新的框架,往往会用一个quickstart快速入门,这次就写一下springboot的quickstart程序. 开发环境 JDK 1.8 Springboot 2.1.6 Maven ...
- python之爬取小说
继上一篇爬取小说一念之间的第一章,这里将进一步展示如何爬取整篇小说 # -*- coding: utf- -*- import urllib.request import bs4 import re ...
- [转发]C++中new和malloc的区别
原文地址:https://blog.csdn.net/linux_ever/article/details/50533149 new与malloc的10点区别 1. 申请的内存所在位置 new操作符从 ...
- IntelliJ IDEA.2017.3.4(win7 64位)的安装使用
下载 1.Idea与Webstorm同为JetBrains公司的产品,因此安装使用方式也极为相似,首先我们打开IDEA的官方下载网站:https://www.jetbrains.com/idea/,点 ...
- 【转载】解密ThreadLocal
概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资 ...
- null和空的区别
python中None和Null的区别 首先了解python对象的概念 python中,万物皆对象,所有的操作都是针对对象的. 那什么是对象?5是一个int对象,‘oblong’是一个str对象,异常 ...
- SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
[转]https://www.cnblogs.com/NeverCtrl-C/p/8191920.html 1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:serv ...
- 开源框架---tensorflow c++ API 运行第一个“手写字的例子”
#CMakeLists.txt cmake_minimum_required (VERSION ) project (tf_example) set(CMAKE_CXX_FLAGS "${C ...
- 链表实现队列(python)
# -*- coding: utf-8 -*- from collections import deque class Node(object): def __init__(self, value=N ...
- rmi的调用
在java8 121版本以前,只要这样就能任意代码 rmiTest.java import javax.naming.InitialContext; import javax.naming.Nami ...