首页 > 编程语言 >深入java虚拟机 - 垃圾收集 - 引用计数收集器

深入java虚拟机 - 垃圾收集 - 引用计数收集器

时间:2023-04-26 19:39:43浏览次数:52  
标签:java 收集 收集器 对象 虚拟机 计数 引用 一个 垃圾


          引用计数是垃圾收集的早期策略。在这种方法中,堆中每一个对象都有一个引用计数。一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被置为1。当任何其他变量被赋值为对这个对象的引用时,计数加1。当一个对象的引用超过了生存期或者被设置一个新的值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集的时候,它引用的任何对象计数值减1。在这种方法中,一个对象被垃圾收集后可能导致后续其他对象的垃圾收集行动。
          这种方法的好处是,引用计数收集器可以很快地执行,交织在程序的运行之中。这个特性对于程序不能被长时间打断的实时环境很有利。坏处就是,引用计数无法检测出循环(即两个或者更多的对象互相引用)。循环的例子如,父对象有一个对子对象的引用,子对象又反过来引用父对象。这些对象永远都不可能计数为0,就算它们已经无法被执行程序的根对象可触及。还有一个坏处就是,每次引用计数的增加或者减少都带来额外开销。
          因为引用计数方法固有的缺陷,这种技术现在已经不为人所接受。现实生活中所遇到的Java虚拟机更有可能在垃圾收集堆中使用追踪算法。

标签:java,收集,收集器,对象,虚拟机,计数,引用,一个,垃圾
From: https://blog.51cto.com/u_1002776/6228649

相关文章

  • java 多线程 synchronized
    程序1:packagetestsynchronized;publicclassThread1implementsRunnable{ @Override publicvoidrun(){ synchronized(this){ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName() +"synchronizedloo......
  • java 一些奇怪的笔试题
    例1:packagecom.test;publicclassTest1{ publicvoidtestExit(){ try{ System.exit(0); }finally{ System.out.println("testExit"); } } publicvoidtestReturn(){ try{ return; }finally{ System.out.println("......
  • docker启动rabbitMQ,通过java创建交换机、队列、绑定
    通过docker启动rabbitMQdockerrun-d--namerabbitmq-p5671:5671-p5672:5672-p4369:4369-p25672:25672-p15671:15671-p15672:15672rabbitmq:management  将其修改为自启动:dockerupdaterabbitmq--restart=always  以下为通过java代码进行创建交换机......
  • 【Java设计模式】装饰者设计模式
    目录1.装饰者模式(Wrapper)概念2.装饰者是什么?3.装饰者设计模式-参与者3.1组成3.1Demo1.Component(抽象构件)2.ConcreteComponent(具体构件)3.Decorator(抽象装饰类)4.ConcreteDecorator(具体装饰类)5.Test类:3.2总结4.JDK源码中的装饰者设计模式扩展:开闭原则1.装饰者模式(Wra......
  • VScode 创建Java项目
    1.点击view找到命令行输入java(ctrl+shift+P)src:一般是自己写的源代码的文件lib:外部引用库等其他的内容bin:二进制程序,用以存放未来的编译文件等  ......
  • javascript操作cookie
    functionsetCookie(name,value){varDays=30;varexp=newDate();exp.setTime(exp.getTime()+Days*24*60*60*1000);document.cookie=name+"="+escape(value)+";expires="+exp.toGMTString();......
  • java 多线程的start()和run()的理解
    run()方法中是各个线程要执行的具体内容。所以当一个线程直接调用run()时那么直接开始执行方法体,这是在main线程中的多个线程只能时按照顺序的等待前面的线程结束run()方法的执行。而调用start方法只是线程进入准备阶段(Ready),并没有真正执行,这需要JVM进行分配时间片进行轮转线程执......
  • VScode配置Java环境
    1.安装VScode2.配置Java环境变量3.配置VScodeJava插件参考博文:VSCode配置调试编译java环境,史上最全!!!安装ExtensionPackforJava插件 VScode配置Java:home文件——首选项——设置输入javahome,选择在settings.json中编辑 {"window.zoomLevel":1,//"j......
  • JavaScript怎么判断一个host是否在局域网中?
    在JavaScript中,可以使用WebRTCAPI来判断一个host是否在局域网中。WebRTCAPI提供了一种用于在浏览器中进行实时通信的技术,其中包括了一些用于网络发现的API。下面是一个简单的实现:functioncheckLocalhost(callback){varpc=newRTCPeerConnection({iceServers:[]});pc......
  • 大华面试java 2023.5
    一张表随着业务递增,如何对一个字段进行快速查询。比如对身高字段查询,要求查询是10的倍数的。考虑分库分表,或者提前计算设置标志位加索引OOM的场景有哪些,分别是什么情况下会出现这样的问题项目中的复杂设计开发流程springcloud动态更新class的原理,类加载机制,java中类加载......