深入理解Java虚拟机阅读心得(二)
深入理解Java虚拟机阅读心得(二)
垃圾收集
程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题。而Java堆和方法区则不一样。
Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活
一。判断对象是否存活
判断对象是否还活着,主要有两种方法
1.引用计数法
给对象添加一个引用计数器,每当一个地方引用时,计数器值加1;
每当一个引用失效时,计数器减1;
任何计数器为0的对象为不可能被使用的对象。
优点:实现简单,判定效率高
缺点:很难解决对象之间的相互循环引用的问题
2.可达性分析法
主流的实现中,都是通过可达性分析法来判定对象是否存活。
该算法基本思想:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索的路径称为引用链;
当一个对象到GC Roots没有任何引用链相连时(即GC Roots无法到达该对象),称为不可达对象,该对象不可用
此时,可以判定该对象是可回收的对象。
Java中可以作为GC Roots的对象包括以下四种:
(1)虚拟机栈中引用的对象
(2)方法区中类静态属性引用的对象
(3)方法区中常量引用的对象
(4)本地方法栈中JNI(一般说的是Native方法)引用的对象
3.方法区的回收
由于方法区中主要存放的是永久代对象,因此,方法区中进行垃圾收集的性价比一般较低。
永久代的垃圾回收主要分为两类:1.废弃常量 2.无用的类
类的卸载条件比较苛刻,需要同时满足以下三个条件:
(1)该类的所有实例已经被回收,即Java堆中不存在该类的任何实例
(2)加载该类的ClassLoader(即类加载器)已被回收
(3)该类对应的java.lang.Class对象没有在任何地方呗引用,无法在任何地方通过反射访问该类的方法
在大量使用动态代理、反射的场景,需要虚拟机具备卸载类的功能,以保证永久代不会造成内存溢出
4.finalize()
类似 C++ 的析构函数,用于关闭外部资源。
但 try-finally 等方式可以做得更好,并且该方法运行代价很高,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。
当一个对象可被回收时,且被判定为有必要执行该对象的 finalize() 方法,那么可能让该对象自救(只需要重新与引用链上的任何一个对象建立关系即可)。
自救只能进行一次,如果回收的对象之前调用了 finalize() 方法自救,后面回收时不会再调用该方法。
二。强引用与软引用
Java对引用的概念分为四种,从强到弱依次为:强引用,软引用,弱引用,虚引用
1.强引用
代码中普遍存在的类似 Object obj = new Object()这种,只要强引用在,该对象永远不会被回收
2.软引用
用来描述一些还有用但非必须的对象;提供了SoftReference类来实现软引用
在系统发生内存溢出异常之前,会把这些对象列入回收范围之中,进行第二次回收
3.弱引用
也是用来描述非必须对象,但是比软引用更弱;提供了WeakReference类来实现
弱引用关联的对象,只能生存到下一次垃圾收集发生之前。
当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
4.虚引用
最弱的引用关系;提供PhantomReference类实现
一个对象是否有虚引用的存在完全不会对其生存时间产生影响,同时也无法通过虚引用来取得一个对象的实例。
设置虚引用的唯一目的是,通过虚引用在这个对象被回收时收到一个系统通知
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
WordPress 5.1:从CSRF到RCE
译文声明本文是翻译文章,文章原作者ripstech,文章来源:blog.ripstech.com 原文地址:https://blog.ripstech.com/2019/wordpress-csrf-to-rce/ 译文仅供参考,具体内容表达以及含义原文为准 × 一、前言注:此漏洞利用和环境较为复杂,实际价值可能并不是很高,但对于XSS与权限管理也有一定参考价值。 上个月我们公布了WordPress 5.0中一个远程代码执行(RCE)漏洞(需通过身份认证)。本文公布了WordPress 5.1中存在的另一个严重的漏洞利用链,使未经身份认证的攻击者能够在5.1.1版之前的WordPress中获得远程代码执行权限。 二、漏洞影响如果WordPress站点启用了评论(comment)功能,那么攻击者可以诱骗目标网站管理员访问攻击者设置的一个站点,最终接管目标站点。一旦受害管理员访问恶意网站,攻击者就会在后台通过跨站请求伪造(CSRF)攻击目标WordPress站点,不会因此目标受害者警觉。CSRF攻击中滥用了WordPress中的多个逻辑缺陷及数据过滤错误,并且结合这些缺陷实现RCE,最终完...
-
下一篇
如何在 Spring 中自定义 scope
大家对于 Spring 的 scope 应该都不会默认。所谓 scope,字面理解就是“作用域”、“范围”,如果一个 bean 的 scope 配置为 singleton,则从容器中获取 bean 返回的对象都是相同的;如果 scope 配置为prototype,则每次返回的对象都不同。一般情况下,Spring 提供的 scope 都能满足日常应用的场景。但如果你的需求极其特殊,则本文所介绍自定义 scope 合适你。 Spring 内置的 scope 默认时,所有 Spring bean 都是的单例的,意思是在整个 Spring 应用中,bean的实例只有一个。可以在 bean 中添加 scope 属性来修改这个默认值。scope 属性可用的值如下: 标题1 标题2 singleton 每个 Spring 容器一个实例(默认值) protot
相关文章
文章评论
共有0条评论来说两句吧...

微信收款码
支付宝收款码