首页 > 系统相关 >深入理解Java虚拟机:JVM高级特性与最佳实践-第三章-垃圾收集器与内存分配策略

深入理解Java虚拟机:JVM高级特性与最佳实践-第三章-垃圾收集器与内存分配策略

时间:2024-07-23 22:40:10浏览次数:17  
标签:Java 收集器 对象 虚拟机 回收 引用 内存

在java内存运行时区域中的各个部分中,程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。但是Java堆和方法区这两个区域具有更大的不确定性,比如一个程序创建了哪些、多少个对象,这部分内存的分配和回收是动态的。

怎样判断对象已死

引用计数算法(Reference Counting)

在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。虽然,计算算法会多占用一些内存来进行计数(这不会占用很多资源),但最大的问题是它不能解决很多例外情况(比如两个对象相互调用,他们的引用计数永远不会为0),所以需要大量的额外处理。所以主流的Java虚拟机里面都没有选用引用计数算法来管理内存。

可达性分析算法(Reachability Analysis)--主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统

这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

在Java技术体系里面,固定可作为GC Roots的对象包括以下几种:
·在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
·在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。
·在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。
·在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
·Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。
·所有被同步锁(synchronized关键字)持有的对象。
·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

java引用关系:
强引用(Strongly Re-ference):程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
软引用(Soft Reference):只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
弱引用(Weak Reference):被弱引用关联的对象只能生存到下一次垃圾收集发生为止。(垃圾收集器强制回收)
虚引用(Phantom Reference):对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。

进阶判断对象是否已死

判断对象是否会被回收是需要至少两次标记过程的:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过(只会调用一次),那么虚拟机将这两种情况都视为“没有必要执行”,进而回收它。

标签:Java,收集器,对象,虚拟机,回收,引用,内存
From: https://www.cnblogs.com/lbxislearning/p/18319769

相关文章

  • 面试题-Java 容器
    List和Set的区别是什么?Vector,ArrayList,LinkedList区别?ArrayList和LinkedList底层是怎么实现的?各自的特点是什么?HashSet和HashMap和的区别?TreeMap和TreeSet区别和实现原理HashMap,Hashtable的区别?HashMap,LinkedHashMap,TreeMap的区别?HashMap,和ConncurrentHashMap......
  • 41-50题矩阵和字符串 在Java中,将大写字符转换为小写字符的方法主要有以下几种:
    20240723一、数组最后几个和字符串的两个448.找到所有数组中消失的数字(和645.错误的集合差不多)283.移动零118.杨辉三角119.杨辉三角II661.图片平滑器(没看懂)598.区间加法II566.重塑矩阵303.区域和检索-数组不可变520.检测大写字母125.验证回文串二、在Jav......
  • JavaSE异常、今日面试题,解决git合并失败的终极篇!!!若以框架报错Invalid bound statement
    20240723一、JavaSE异常二、今日面试题三、解决git无法合并推送问题(终极篇!!!)1.直接把你写的复制出来,然后输入git命令1.1.解决办法一:保留本地的更改,中止合并->重新合并->重新拉取1.2解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)2.然后复制回来,然后再合并推......
  • 《Java初阶数据结构》----3.<线性表---LinkedList与链表>
    目录前言一、链表的简介1.1链表的概念1.2链表的八种结构 重点掌握两种1.3单链表的常见方法三、单链表的模拟实现四、LinkedList的模拟实现(双链表)4.1 什么是LinkedList4.2LinkedList的使用五、ArrayList和LinkedList的区别 前言   大家好,我目前在学习......
  • 黑马pink JavaScript学习笔记_Web APIs Day2
    事件监听(绑定)什么是事件?事件是系统内发生的动作或者发生的事情。比如:用户点击页面上的一个按钮。什么是事件监听?就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为注册事件比如:鼠标经过的时候,弹出一个alert“鼠标经过了~”语法元素对象.addEven......
  • 大规模Java应用程序的性能调优策略
    大规模Java应用程序的性能调优策略大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨大规模Java应用程序的性能调优策略。随着应用程序的规模增大,性能瓶颈可能会显现出来,因此对性能的优化是保证应用系统高效运行的关键。一、JVM参数调优......
  • Java并发编程的高级技术与最佳实践
    Java并发编程的高级技术与最佳实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来深入探讨Java并发编程的高级技术与最佳实践。并发编程是Java开发中的一项重要技能,它能够充分利用多核处理器的优势,提高应用程序的性能和响应能力。本文将从高级......
  • 使用Docker和Kubernetes管理Java微服务
    使用Docker和Kubernetes管理Java微服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Docker和Kubernetes来管理Java微服务。Docker和Kubernetes是现代微服务架构中不可或缺的工具,它们能够极大地简化应用程序的部署和管理,提高开发......
  • 分布式系统中的Java应用:挑战与解决方案
    分布式系统中的Java应用:挑战与解决方案大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在分布式系统中使用Java的挑战与解决方案。分布式系统在处理大规模数据和高并发访问方面具有显著优势,但也面临诸多复杂性和挑战。本文将深入分析这些挑......
  • 探索Java虚拟机优化技术:从基础到高级
    探索Java虚拟机优化技术:从基础到高级大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java虚拟机(JVM)的优化技术,从基础到高级,为Java程序的高效运行提供全面指导。一、JVM概述Java虚拟机是Java程序的运行环境,负责加载字节码、执行代码、......