博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《深入理解Java虚拟机》学习笔记(二)
阅读量:7040 次
发布时间:2019-06-28

本文共 846 字,大约阅读时间需要 2 分钟。

  垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法。  

  引用计数法:

  主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决。

 

  可达性分析法:

  这个算法的基本思路是:通过一系列称为“GC Roots”的对象作为起始点,向下搜索,走过的路径称为引用链,当对象到GC Roots没有任何的引用链时,则认为对象是可以被回收的。

   

  Java中,可以作为GC Roots的对象包括:

  1》虚拟机栈中引用的对象

  2》方法区中静态属性引用的对象

  3》方法区中常量引用的对象

  4JNI引用的对象

 

  JDK1.2之后对象的引用可以分为强引用,软引用,弱引用,虚引用4种,引用的强度依次地减弱。

  强引用,通过new对象来实现的引用。

  软引用,内存充足时不进行回收,内存不足时会被回收。

  弱引用,不管内存是否充足都会被回收。

  虚引用,无法通过虚引用来获取一个对象实例,为一个对象设置虚引用的唯一目的就是能在这个对象被回收时收到一个系统通知。

 

  方法区中的回收主要包含2部分:废弃的常量和无用的类。

  例如常量池中有一个名为“abc”的字符串常量,但是没有被系统中的任何字符串所引用,则将对其进行回收。

  类需要同时满足下面3个条件才能被定义为无用的类:

  1》该类所有的实例都已经被回收

  2》加载该类的ClassLoader已经被回收

  3》该类的Class对象在任何地方没有被引用,无法在任何地方通过反射访问该类

 

  垃圾回收算法

  标记清除法

  该算法存在2个问题:

  一是效率不高,标记和清除2个过程的效率都不是很高

  二是产生大量碎片的问题,再给大对象分配内存时可能会因为无法找到足够大的连续的内存,又进行一次垃圾回收。

  

 

  复制算法

 

转载于:https://www.cnblogs.com/lnlvinso/p/4376741.html

你可能感兴趣的文章
centos6.8 yum安装mysql 5.6 (完整)
查看>>
知识点总结报告 2.3
查看>>
添加千位分隔符
查看>>
【整理】网站返回顶部代码
查看>>
使用Cloud-Config
查看>>
sqlite3-第五章 API-核心API
查看>>
linux svn服务器权限配置
查看>>
Objective-C语法property详解
查看>>
通过Kickstart 制作引导镜像
查看>>
ubuntu安装salt-ssh
查看>>
从浏览器打开网址到请求到网页内容超细原理过程详解(免费)
查看>>
windows内存泄漏检测
查看>>
TF-IDF
查看>>
Hbase日常运维
查看>>
我是架构师-常用类型-容器-不再推荐的容器
查看>>
【一天一个shell命令】文本操作系列-tree
查看>>
【一天一个shell命令】文本操作系列-tac,rev
查看>>
链表中环的入口结点
查看>>
CNN-Pooling layer&strided convolution
查看>>
join联表中on,where后面跟条件的区别
查看>>