当前位置: 首页 > news >正文

Jvm对象回收算法-JVM(九)

上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。

Jvm参数设置-JVM(八)

  • 老年代分配担保机制

这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。

  1. 老年代剩余空间是否 大于 年轻代里现在所有对象

大于的话则直接minorGC

  1. 如果不大于则看看参数是否配置:-XX:-HandlerPromotionFailure

没有配置则直接fullGC

  1. 配置了则看看 老年代剩余可用空间是否 大于 每次minorGC后进入老年代的平均值

大于的话直接minorGC,否则直接fullGC

FullGC之后最后还是会minorGC。

  • 对象内存回收
  1. 引用计数器

这个方法简单效率高,但目前主流虚拟机没有用表格这个算法,主要不能解决循环引用问题。因为两者相互引用,导致他们引用计数器不为0,而引用计数器必须是为0才会回收。

 

  1. 可达性分析算法

将GC roots对象作为节点,向下搜索,找到对象都标记为 非垃圾对象,其余未标记的都是 垃圾对象。

GC roots根节点,:线程栈本地变量,静态变量,本地方法栈变量等。

  • 常见引用类型

引用类型:强引用,软引用,弱引用,虚引用

  1. 强引用:User user = new User();
  2. 软引用:用SoftReference软引用类型包裹对象, 正常不会被回收,但GC做完释放不出空间放新对象,则会回收。软引用可以作用在内存敏感的高速缓存。

SoftReference<User> user = new SoftReference<User>(new User());

软引用在实际场景很重要,例如浏览器后退按钮,这个后退是重新加载还是从缓存里取,这要看实际应用场景。

  1. 如果一个浏览器进入新页面就内容回收,则需要重新加载。
  2. 如果浏览页面内存很大,放在内存会内存溢出。
  1. 弱引用GC每次会直接回收。

WeakReference<User> user = new WeakReference<User>(new User());

  1. 虚引用也成为幽灵引用,几乎不用。
  • finalize()方法最终判断对象是否存活

当对象背回收之前,会判断这个对象是否覆盖了finalize方法,如果覆盖了,在回收之前则会执行这个方法,不回收则不执行。

既然在回收之前会执行,那么自然可以自救,可以把当前对象放入静态list集合保证在使用则不会被收回。(不推荐使用)

  • 如何判断一个类是无用的类

方法区如果发生回收的条件,必须这个类是无用的类:

  1. 该类所有对象实例都被回收,也就是java堆中不存在该类任何实例。
  2. 加载该类的ClassLoader已经被回收。(CLassLoader回收条件很苛刻)

前面说过引导类(核心包)BootStrapClassLoader,扩展ClassLoader以及appClassLoader应用程序的classLoader,这些不会被回收。

但是jsp的加载器,每个jsp都对应一个新的加载器,这种加载器就很容易被回收。(一般自定义的才会回收)

  1. 该类的java.lang.Class对象没有地方被引用,无法在任何地方通过反射访问该类信息。

http://www.lryc.cn/news/94743.html

相关文章:

  • SpringCloud Alibaba微服务分布式架构组件演变
  • 【Linux】初步理解操作系统和进程概念
  • TypeScript 中的字面量类型和联合类型特性
  • react+jest+enzyme配置及编写前端单元测试UT
  • 自学网络安全(黑客)
  • 【unity小技巧】委托(Delegate)的基础使用和介绍
  • 【MySQL必知必会】第24章 使用游标(学习笔记)
  • rosbag回放指定话题外的其他话题的方法
  • 6.2.1 网络基本服务---域名解析系统DNS
  • 通用文字识别OCR 之实现自动化办公
  • Spring Boot 有哪些特点?
  • 10个图像处理的Python库
  • 项目里不引入外网链接的解决方法
  • Java的jdk配置成功,但是输入java -version等,命令行没有任何反应
  • MySQL select查询练习
  • Github 标星 60K,不愧是阿里巴巴内部出厂的“Java 核心面试神技”
  • git 使用教程
  • 【Vue2.0源码学习】模板编译篇-模板解析阶段(HTML解析器)
  • ARM裸机开发-串口通信
  • Dubbo分布式服务框架,springboot+dubbo+zookeeper
  • 网络:UDP out of order;SIP;CPU out-of-order 执行
  • 我心中的TOP1编程语言—JavaScript
  • CentOS环境下的Maven安装
  • 表的增删改查
  • Tauri 应用中发送 http 请求
  • 基于霍夫变换的航迹起始算法研究(Matlab代码实现)
  • 如何使用Excel公式将(d:1,a:4,c:2,b:3)快速分割成8列并按顺序排列
  • 遥控泊车系统技术规范
  • qt 线程状态机实现并发自动任务
  • 社交机器人培育