首页 > 其他分享 >JVM学习笔记(三)

JVM学习笔记(三)

时间:2023-09-14 14:36:33浏览次数:56  
标签:标记 对象 内存 回收 学习 算法 笔记 JVM 引用


这是该专题Blog连载的第三部分,整理一下发上来。

-------------------------------------------------------

与垃圾收集GC相关的3件事:

1.哪些内存需要回收?

2.何时回收?

3.怎么回收?

上面3条分别对应了2部分知识:

1.垃圾收集算法(对应1)。

2.垃圾收集器(对应2、3)。

下面分别学习这些知识。

 

一、什么地方需要回收内存:

程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭。每一个栈帧中分配多少内存基本上是在类结构定下来时就已知,所以这几个区域的内存分配和回收都具备确定性,方法或线程结束时,内存自然就跟随着回收了。

Java堆和方法区则不一样。只有在程序运行时才能知道会创建哪些对象,这部分内存的分配和回收是动态的,垃圾收集器关注的是这部分内存。

判断对象是否存活方法:

1、引用计数算法:给对象中添加一个引用计数器,每有一个地方引用它时,计数器的值就加1.当引用失效时计数器值就减去1.任何计数器为0的对象就是不可能再被使用的。(Java语言没有选用这个算法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用问题)

2、根搜索算法:主流商用语言(Java、C#等)都是用根搜索算法判断对象是否存活。算法基本思路就是通过一系列名为GCRoots的对象作为起始点,从这些节点开始向下搜索,走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

Java中GC Roots对象包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中的常量引用的对象、本地方法栈中JNI的引用的对象。

在根搜索中不可达的对象,处于缓刑阶段,真正宣告一个对象死亡,至少要经历两次标记过程:

(1)根搜索后发现没有与GC Roots相连接的引用链,将会被第一次标记并且进行一次筛选。筛选的条件是此对象是否有必要执行finalize()方法。如果没有覆写finalize()方法或者已经被虚拟机调用过,虚拟机视为没有必要执行finalize(),放入即将回收的集合。

(2)如果被判定为有必要执行finalize()方法,那么这个对象将会被优先放置在一个队列之中,并由虚拟机自动建立的、低优先级的finalizer线程执行(只是触发该方法,并不一定等其结束,防止出现无限循环等情况)。GC将在队列中的对象进行第二次小规模标记(标记即将回收的集合),如果把自己赋值给某个类变量或对象成员变量,将被移出即将回收的集合。

注:finalize()方法不要使用,try-finally能做所有finalize能做的工作(释放资源等)。

3、JDK1.2之后的引用:将引用分为强引用、软引用、弱引用、虚引用四种。

4、回收方法区:

在方法区进行垃圾回收的性价比一般比较低。在堆中,新生代,常规应用进行一次垃圾收集一般可以回收70%-95%的空间,而永久代的垃圾收集效率远低于此。

永久代回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似,即没有其他地方引用了这个字面量,在内存回收时,该常量会被系统请出常量池。

回收无用的类的3个条件:

(1)该类所有的实例都已经被回收(Java堆中不存在该类的任何实例)。

(2)加载该类的ClassLoader已经被回收。

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

虚拟机可以对满足上述3个条件的无用类进行回收。

5、是否对类进行回收hotspot虚拟机提供参数:

-Xnoclassgc参数进行控制,还使用-verbose:class及-XX:+TraceClassLoading、-XX:+TraceClassUnLoading查看类加载和卸载信息。

大量使用反射、动态代理、CGLIB等框架的场景,以及动态生成JSP和OSGi频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。

 

二、垃圾收集算法

1、标记-清除算法:

该算法分为两个阶段,标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

特点:最基础的收集算法。

缺点:时间问题,标记-清除的效率都不高。空间问题,清除后产生大量不连续空间的内存碎片,当程序运行需要分配大对象时无法找到足够连续的内存而不得不提前触发另一次垃圾收集动作。

2、复制算法(新生代算法):

特点:将可用内存按容量分为大小相等的2块,每次只使用其中的一块。当一块用完,就把存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

缺点:将内存缩小为原来的一半。

商业虚拟机都采用复制算法来回收新生代。

新生代对象一般98%都是朝生夕死,所以将内存分为较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor空间。回收时将Eden和Survivor中存活的对象一次性地拷贝到另外一块Survivor空间上,并清理掉Eden和刚才用过的Survivor空间。当存活对象大于待复制的Survivor的空间时,这些对象通过分配担保机制直接进入老年代。

3、标记-整理算法(老年代算法):

有人提出一种标记整理算法,标记过程仍然与标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

4、分代收集算法:

一般把Java堆分为新生代和老年代。

在新生代中,每次垃圾收集是都有大批对象死去,只有少量存活,因此选用复制算法。只需付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用标记-清理或标记-整理算法来回收。

 

标签:标记,对象,内存,回收,学习,算法,笔记,JVM,引用
From: https://blog.51cto.com/u_6978506/7470102

相关文章

  • Memcached深入学习总结
    在上一家公司时,产品主要使用memcached做缓存。虽然目前这家公司memcached使用的比较少(刚进公司做云存储相关服务时小规模使用了一下,后来做另一个系统时换redis做了缓存),但前几天整理资料时看到了原先写的memcached相关笔记,在此整理一下发上来。----------------------------------......
  • MongoDB Sharding深入学习
    对于MongoDB的Sharding(分片)技术并不陌生,但是发现里面其实还是有不少值得深入学习的东西。笔记整理一下发上来跟大家分享。-----------------------------------一、MongoDB分片机制:1、一个分片包含数据的某一子集。若某一分片包含多台服务器。则每台服务器都拥有完整的数据副本。......
  • 互联网架构学习相关资料
    最近看到很多不错的互联网架构方面的学习资料和个人blog。原来都是整理放在Mybase中,现在搬到Blog上,一是方便查看及更新,二是希望对看到的人也有所帮助。 整理如下(排序不分先后):1.架构设计与架构思想2.高性能MYSQL的构架与相关软件介绍3.http://wenku.baidu.com/view/e8b2e23343323......
  • 读清华学霸的学习计划表有感
    近日,网络上疯传清华大学某特等奖学金得主的学习计划表,看后感叹此人真是不辱"学霸"的称号。不说别的,就是除周末外每天凌晨1点睡觉,早上6点起床这一条来说,我几乎就做不到。想想自己每天23点睡,早上7点半8点起,而且大多数下班时间都不是在学习,真有点感觉是在浪费生命了。看来,今后我也要多......
  • JVM学习笔记(二)
    接上文------------------------------------二、类文件结构虚拟机不关注Class的来源是什么语言,它只要符合Class文件应有的结构就可以在Java虚拟机中运行。1.Class类文件结构Class文件是一组8位字节为基础的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何......
  • JVM学习笔记(一)
    前言:曾经看过一本很好的关于介绍Java虚拟机的书,好像叫《深入Java虚拟机(第二版)》的电子版,但不慎遗失了,实在可惜。有时间再到网上找找,看还有没有下载的。  一、关于运行时数据区域:1.Java虚拟机所管理的内存将包括以下的几个运行时数据区域:程序计数器、Java虚拟机栈、本地方法栈、......
  • Office学习之excel
    报了一个简知学office课程,贵了点,还是能学到不少东西的,当然如果你勤奋好学这些资料网上应该也有,我比较懒。之前也学了一部分,但是前面学后面忘,尤其是excel用的不多的情况下,很快就忘了,就想着把一些知识点记录下来知识点一:数据表格内容叠在一起,一列列的双击太费事,将鼠标放在空白处然......
  • 3-spark学习路线-Spark安装
    1.从https://spark.apache.org/获得Spark的安装包2.解压并安装Sparktar–zxvfspark-****-bin-hadoop2.7.tgz3.配置Spark在YARN平台上运行Spark需要配置HADOOP_CONF_DIR、YARN_CONF_DIR和HDFS_CONF_DIR环境变量3.1vim/etc/profile ex......
  • 2-spark学习路线-应用常景和解决
    在实际应用中,大数据处理主要包括以下三个类型:1.复杂的批量数据处理:通常时间跨度在数十分钟到数小时之间2.基于历史数据的交互式查询:通常时间跨度在数十秒到数分钟之间3.基于实时数据流的数据处理:通常时间跨度在数百毫秒到数秒之间当同时存在以上三种场景时,就......
  • 【刷题笔记】50. Pow
    题目Implement pow(x, n),whichcalculates x raisedtothepower n (xn).Example1:Input:2.00000,10Output:1024.00000Example2:Input:2.10000,3Output:9.26100Example3:Input:2.00000,-2Output:0.25000Explanation:2-2=1/22=1/4=0.25N......