python程序如何执行死刑图片_如何判断对象已死
已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了:
引用计数
给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1;当引用失效时,计数器减 1;任何时刻计数器为 0 的对象就是死的对象。
1. 这种方式被很多技术所采用,如 FlashPlayer(AS3)、Python 等,但是 Java 没有采用这种算法,原因是它很难解决对象之间相互循环引用的问题,例如 ObjectA.param=ObjectB,ObjectB.param=ObjectA,对象 A 和 B 相互引用但是除此之外他们再无任何其他引用,这样他们的引用计数都不为 0,永远不会被回收
根搜索
Java 采用的是根搜索算法,这个算法的基本思路是通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所经过的路径称为引用链,当 GC Roots 到一个对象不可达时,这个对象就是不可用的
1. Java 中可作为 GC Roots 的对象包括:
1)虚拟机栈中引用的对象
2)方法区中类静态属性和常量引用的对象
3)本地方法栈中 Native 方法引用的对象
何为引用(和 ROOT 有关系)
简单描述引用就是一块内存中存储的数值代表的是另外一块内存的起始地址,则成这块内存代表着一个引用,这种描述很纯粹但是是不太正确的,可以作为理解时用
1. 引用分为强引用、软引用、弱引用、虚引用
1)强引用:如 Object obj=new Object();只要强引用存在,GC 肯定不会回收被引用的对象
2)软引用:非必需的对象,当系统要发生内存溢出之前,会把这些对象列入回收范围
3)弱引用:更加非必需的对象,弱引用关联的对象只能生存到下一次垃圾回收之前
4)虚引用:也叫幽灵引用或者幻影引用,它是最弱的一种引用,虚引用不会引用一个对象的生命周期,也无法通过一个虚引用获取一个对象实例,只是虚引用的对象被回收时会有一个通知返回回去
两次标记——死刑
一个对象在进行根搜索后发现没有与 GC Roots 相关联的引用链(和皇帝没有关系),那么它将被第一次标记并且进行一次判断,判断该对象是否覆盖了 finalize 方法(被下了死刑),如果是的,则认为有必要执行回收(死刑),如果不是则判断 finalize 方法是否已经被虚拟机调用过,如果已经调用过了,则认为没必要执行了(因为已经执行过死刑了)
如果一个对象被判定为执行死刑,那么这个对象将会被放置在一个名为 F-Queue 的队列中(关起来了),这个队列会在另外一条线程中执行死刑,因为队列中的对象可能存在死循环等情况(危险分子),在 GC 主线程中执行可能导致整个 GC 崩溃
稍后 GC 便会新开一条线程来执行死刑,它先对 F-Queue 中的对象进行第二次标记,这时如果队列中有个对象与引用链上任何一个对象建立关联(有人给你喊刀下留人),那么在这次标记中它将会被移出 F-Queue,不然就死了
永久代就不会被杀吗
JVM 规范中说过方法区(永久代)可以不实现垃圾回收,但是被上了免死金牌的永久代也是可以杀的,只是杀的少些而已,不像新生代,一次垃圾收集就可以杀掉 70%~95% 的对象
1. 永久代回收只要针对两部分内容:废弃常量和无用的类
1)回收废弃常量例子:一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个 String 对象叫做“abc”,而且如果必要的话(没内存啦),那么这个对象将会被请出常量池(朝廷没钱了,就不给一些朝中无人的王爷发钱了,自己过日子去)
2)判断一个类似“无用的类”
·该类所有的实例都被杀掉
·加载该类的 ClassLoader 已经被杀掉
·该类的 Class 对象没有在任何地方被引用,没有在任何地方通过反射访问该类地方法
满足这三个条件也并不是一定要杀掉,详见类卸载,主要在经常要大量使用反射、CGLib、动态代理、动态生成 JSP、OSGI 等场景需要配置下,以保证永久代不会溢出
一个例子
问题:下面代码中,第几行的哪个对象符合垃圾回收标准?
1 Object a = new Object();
2 Object b = new Object();
3 Object c = new Object();
4 a = b;
5 a = c;
6 c = null;
7 a = null;
答案:直到第 7 行时才有一个对象 c 符合了垃圾回收标准
python程序如何执行死刑图片_如何判断对象已死相关推荐
- python程序如何执行死刑_「Python基础知识」Python生成器函数
原标题:「Python基础知识」Python生成器函数 对于程序而言,内存也是很重要的,因为程序中很多数据都是保存在内存中的,如果内存中存储的数据过多,那么系统就会崩溃,这是人们不希望发生的. 可以采 ...
- python 二进制流转图片_Python零基础入门到精通-5.1节:Python程序的执行过程
教程引言: 系统地讲解计算机基础知识,Python的基础知识, 高级知识,web开发框架,爬虫开发,数据结构与算法,nginx, 系统架构.一步步地帮助你从入门到就业. 5.1.1 在命令行中执行Py ...
- python怎么运行_程序员大牛讲解,Python程序的执行原理
人工智能的火热让Python成为近两年来发展最好的开发语言,Python已经被越来越多的人所熟知,Python开发工程师水涨船高的薪资也吸引着更多的人进入这个行业.一名合格的Python工程师怎么能不 ...
- python执行原理是什么意思_简述Python程序的执行原理。
[简答题]什么是遗传密码的摆动性? [简答题]请将下列程序补充完整,并将源代码和运行结果截图提交. 要求:从键盘输入任意实数,请输出其绝对值. 注意:完善源代码文档信息,并为程序添加必要的注释. /* ...
- python语言是编译型语言-Python程序的执行过程原理(解释型语言和编译型语言)...
Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的 ...
- python运行程序-Python程序的执行过程
1.C++和C都是属于编译型语言,本来的.c文件都是用高级语言编写的,计算机是不能识别高级语言的,所以,必须要通过编译,链接等手段,将.c文件转换成可执行文件,可执行文件就是纯二进制文件,然后计算机才 ...
- python运行程序-一文看懂python程序的执行过程
本文主要介绍的是python程序的执行过程,首先介绍的是编译过程,其次介绍的是过程图解及编译字节码,最后介绍了codeobject对象的属性,具体的跟随小编一起来了解一下. 一.编译过程概述 当我们执 ...
- python打开是什么样的-Python程序的执行过程是什么样的?
我们都知道,使用CC++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制可执行文件.运行该程序的时候,就可以二进制程序从硬盘载入到内存中并运行. 但 ...
- 如何设置python程序定时执行?
前几天有小伙伴在留言区问能不能将python程序设置成定时执行? 确实是个好提议,也只有将它设置为每天早上定时执行,才能当之无愧的叫做解放双手!实际上python程序定时执行有N多种方法,今天先介绍最 ...
最新文章
- 例题3-6 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)
- CopyCat 代码克隆检测发布,剑指开源软件抄袭
- git 可视化工具_版本控制可视化神器Gource:简单易上手,效果恰似烟花秀
- 一些dos下简单命令
- NB-IOT连接移动onenet平台流程
- 理论与实践:如何从Hadoop迁移到MaxCompute
- c语言终极面试宝典 pdf,C语言终极面试--编程
- LeetCode:每日一题(2020.4.13)
- php必填参数校验,laravel请求参数校验方法
- mybatis分页插件 pagehelper点击末页跳到第8页
- MMD原神动画制作(学习教程一)
- java 无锁并发_高并发情况下怎样尽量实现无锁编程
- [12-22]XP系统城市更新[www.xp366.com]
- 每日一记,养成记录的习惯
- 国家医保移动支付国密算法SM2签名验签、SM4加解密测试工具
- python实现 数值 转换为 万,亿单位,保留3位小数(例:18000转换为1.8万)
- 北京因地制宜编制村庄规划 着重体现京韵农味
- 去日本东京旅行(1)-- 机场篇
- 超详细的pytorch版本yolov3安装教程--亲测有效!!!
- qq部落android,QQ部落安卓版
热门文章
- pip 升级之后提示 bash: /usr/bin/pip3: No such file or directory
- 【C#】类——里式转换
- jquery.raty评星插件
- Pycharm中一些不为人知的技巧pycharm技巧
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
- 国内操作系统OS分析(上)
- CUDA C++编程接口:编译
- 客快物流大数据项目(十):Docker容器命令
- 2021年大数据ZooKeeper(六):ZooKeeper选举机制
- Python 爬虫框架Scrapy安装汇总