JVM&GC(一)java引用

【自动驾驶规划】Lattice Planner Lattice Planner简介 LatticePlanner算法属于一种局部轨迹规划器,输出轨迹将直接输入到控制器,由控制器完成对局部轨迹的跟踪控制。因此,Lattice Planner输出的轨迹是一条光滑无碰撞满足车辆运动学约束和速度约束的平稳安全的局部轨迹。Lattice Planner的输入端主要由三部分组成,感知及障碍物信息、参考线信息及定位信息。局部规划模块的输出是带有速度信息的一系列轨迹点组成的轨迹,其保证了车辆控制器在车辆跟踪控制过程中的平稳性和安全性。 局部规划模块的输出是带有速 阅读详情

前言

Java中的引用有点像C++中的指针,通过引用可以对堆中的对象进行操作。在Java程序中最常见的引用类型是强引用,也是默认的引用类型。当在Java语言中使用New操作符创建一个新的对象,并将其赋值给一个变量的时候,这个变量就成为指向该对象的一个强引用。

Jva中的引用

Java中提供了四个级别的引用,强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)。

强引用

在一个线程内,无需引用直接可以使用的对象,除非引用不存在了,否则强引用不会被GC清理。JVM即使抛出OOM异常,也不会回收强引用所指向的对象。强引用可能导致内存泄漏问。

        String str = "hello";
        String str1 = str;
        System.out.println(str==str1);

str变量将被分配到栈内,而“hello”对象则被分配在java堆中。局部变量str指向“hello”实例所在的堆空间,通过str可以操作该实例。此时str就是该实例的引用。
str1 = str此时,str所指向的对象也被str1所指向,同时会在局部栈空间上分配空间存放str1变量。
对引用使用==比较的是两个引用所指向的堆空间的地址是否相同。

软引用

软引用是除了强引用外,最强的引用类型。用来描述一些还有用但是并非必须的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null
//sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当这个对象被标记为需要回收的对象时,则返回null;

SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。一旦垃圾线程回收该Java对象之后,get()方法将返回null。

软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。使用软引用能防止内存泄露,增强程序的健壮性。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的对象的Reference对象。当调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。在任何时候,都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。利用这个方法,可以检查哪个SoftReference所软引用的对象已经被回收,于是可以把这些失去所软引用的对象的SoftReference对象清除掉。

Java虚拟机会尽量让软引用存活的时间长一些,迫不得以才清理。

import java.lang.ref.SoftReference;
 
public class TestRef {
    public static void main(String args[]) {
        SoftReference<String> str = new SoftReference<String>(new String("abc"));
        System.out.println(str.get());
        //通知JVM进行内存回收
        System.gc();
        System.out.println(str.get());
    }
}

图片.png

弱引用

在java中,可以用java.lang.ref.WeakReference实例来保存对一个Java对象的弱引用。

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾

当GC进行回收时,需要通过算法检查是否回收软引用对象,而对于弱引用对象,GC总是进行回收。弱引用对象更容易,更快的被GC回收。弱引用对象尝尝用于Map结构中,引用数据量比较大的对象,一旦该对象的强引用为null时,GC能够快速的回收该对象空间。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。

import java.lang.ref.WeakReference;
 
public class TestRef {
    public static void main(String args[]) {
        WeakReference<String> str = new WeakReference<String>(new String("abc"));
        System.out.println(str.get());
        //通知JVM进行内存回收
        System.gc();
        System.out.println(str.get());
    }
}

图片.png

虚引用

又称为幽灵引用,主要目的是在一个对象所占的内存被实际回收之前的到通知,从而可以进行一些相关的清理工作。幽灵引用在创建是必须提供一个引用队列作为参数,它的作用在于检测对象是否已经从内存中删除,跟踪垃圾回收过程。其次幽灵引用对象的get方法总是返回null,因此无法通过幽灵引用来获取被引用的对象。

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
 
 
public class TestRef {
    public static void main(String args[]) {
        ReferenceQueue<String> queue = new ReferenceQueue<>();
        PhantomReference<String> str = new PhantomReference<String>("abc", queue);
        System.out.println(str.get());
    }
}

图片.png

个人博客
腾讯云社区
掘金
优快云
简书
GitHub
码云
OSCHINA
Segmentfault
公众号:wx.jpg

低功耗模式下的看门狗使用 最近用国产芯片AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~ 为了最大限度的降低功耗,我用的是待机模式,先看看几种低功耗模式以及唤醒的区别: 而看门狗AT32提供了两种,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点: 1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常 阅读详情

相关推荐

给爸妈买的红米12C想装个老年桌面?先别急,解锁BL和Root前你得知道这些

本文详细解析了红米12C解锁BL和Root的利弊,为想要为长辈简化手机操作的用户提供全面指南。文章对比了BL解锁与Root的技术差异,推荐优先使用MIUI内置的极简模式等官方功能,并评估了Root的实际必要性。若必须Root,提供了安全操作流程和长期维护建议,帮助用户做出明智选择。

weixin_30265103的博客 318

[转]GC回收机制之引用-强引用、弱应用、软应用和虚引用

Java执行GC判断对象是否存活有两种方式其中一种是引用计数。引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到底强引用、弱引用、软引用和虚引用。

qq_41172574的博客 551

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

GC - Java 四种引用类型

Java 四种引用类型: 强引用、软引用、弱引用、虚引用

nuo 384

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

保姆级避坑指南:用Docker在Ubuntu 22.04上部署Isaac Sim 5.1.0,搞定宇树G1仿真环境

本文提供了一份详细的保姆级避坑指南,帮助用户在Ubuntu 22.04上通过Docker部署Isaac Sim 5.1.0,并成功搭建宇树G1仿真环境。文章涵盖了环境准备、Docker与NVIDIA容器工具包的配置、Isaac Sim镜像的定制化拉取与配置,以及宇树G1仿真环境的实战调试,旨在帮助开发者高效解决部署过程中的常见问题。

weixin_33728268的博客 207

Java:JVM基础

方法区是一种设计规范,属于JVM运行时数据区域的一块逻辑区域,是各个线程共享的内存区域,当虚拟机要使用一个类时,它需要读取并解析Class文件获取相关信息,再将信息存入方法区,主要是类信息、字段信息、方法信息、常量、静态变量等。符号引用以一组符号来描述所引用的目标,可以是任何形式的字面量,比如类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等,在编译期或者运行期间生成,不依赖于具体的内存地址,而是在运行时根据上下文信息去定位目标。直接内存是一种特殊的内存缓冲区,通过JNI的方式在本地内存中分配。

无名J0kзr的博客 887

告别复杂配置!用GuidosToolbox 3.0做MSPA景观格局分析,从安装到出图全记录

本文详细介绍了如何使用GuidosToolbox 3.0进行MSPA景观格局分析,从安装配置到出图全流程。涵盖环境准备、数据预处理、参数设置、结果解读及可视化技巧,帮助用户快速掌握这一生态安全评估工具。特别针对安装教程中的常见问题提供解决方案,提升分析效率。

weixin_29248313的博客 489

JVM总结二

JVM垃圾回收机制 GC原理 GC (Garbage Collection:即垃圾回收)的基本原理:将堆内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器 由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停 对新生代的对象的收集称为minor GC 对老年代的对象的收集称为Full GC 程序中主动调用System.gc()强制执行的GC为Full GC WeakHashMap:Java 的4种

qq_52840805的博客 332

数据结构——滑动窗口

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i < k−1 则重复第一步更新:更新答案。一般是更新最大值 / 最小值出:下标为 i−k+1 的元素离开窗口,更新相关统计量✔1. 定长子串中元音的最大数目✔2. 找到一个数字的 K 美丽值✔4. 子数组的最大平均数 |方法一:前缀和方法二:滑动窗口7. 得到 K 个黑块的最少涂色次数8. 爱生气的书店老板9. 几乎唯一子数组的最大和10. 长度为 K 子数组中的最大和11. 可获得的最大点数12. 最少交换次数来组合所有的1 ||

qq_68915288的博客 762

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 196

Java主动调用GC方法

MemoryMXBean.gc()和System.gc()的内部实现都是Runtime.getRuntime().gc(),从效果上说两者一模一样没有区别。另Java的GC是由JVM自行调动的,在需要的时候才执行,上面的指令只是告诉JVM尽快GC一次,但不会立即执行GC。Java的公有API可以主动调用GC的有两种办法,一个是。作用跟System.gc()也是类似的。

qq_43985303的博客 3181

Spring AI 实战(11):收官!10 道面试高频题 + 一张脑图带走全系列

本文是Spring AI系列的收官篇,通过知识脑图梳理前10篇内容,提供面试高频题和避坑清单。主要内容包括: 知识脑图:分6层(核心抽象、输入增强、输出控制等)总结Spring AI全栈技术。 10道高频面试题:涵盖ChatClient/ChatModel关系、结构化输出、RAG链路等核心知识点。 避坑清单:列出9条常见问题及解决方案,如向量维度匹配、Advisor顺序等。 技术对比:分析Spring AI、LangChain4j和Spring AI Alibaba的差异与适用场景。 使用建议:提供面试复习

不才不才不不才的博客 296

Java JVM&GC

文章目录JVM&&GC1.JVM概述什么是虚拟机?什么是Java虚拟机Java虚拟机架构Hostpot虚拟机共有设计,私有实现2.类加载类加载器类加载过程面试题双亲委托机制使用类加载器夹杂属性文件3.运行时数据区概念程序计数器虚拟机栈和本地方法栈栈帧栈帧结构-局部变量表栈帧结构-操作数栈Demo栈帧结构-动态连接栈帧结构-方法返回地址堆堆-对象分配策略Java对象方法区运行时常量池HotSpot方法区实现的变迁直接内存其他空间逃逸分析4.垃圾判断5.垃圾回收算法6.垃圾收集器 JVM&amp

DemoD_的博客 1108

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

四、Java 之 JVM&GC

1 JVM 1.1 谈谈你对Java的理解 可以从以下几个方面展开 平台无关: 即编译一次,可以运行在任何平台上 GC(垃圾回收机制) 语言特性: 泛型,反射,lambda表达式 面向对象: 封装,继承,多态 类库: 数据库,IO 异常处理 1.2 平台无关性如何实现 答: 使用javac命令将.java文件编译成JVM可识别的字节码文件, 在你所要运行的平台上,安装上对应JVM,java命令...

叶晓默 536

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

笔记H《JVM&GC》

文章目录JVMJVM 内存结构垃圾回收算法GC RootJVM参数配置查看当前运行程序的配置查看JVM默认值参数常见参数GC日志 JVM JVM 内存结构 垃圾回收算法 引用计数 复制 标记清除 标记整理 GC Root 什么是垃圾:内存中已经不在被使用到的空间就是垃圾,要进行垃圾回收,首先需要判断一个对象是否可以被回收。 如何判断一个对象是否可以被回收: 引用计数; Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回

DeaSun 1092

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JAVA面试题-JVM&GC机制

什么是GC机制 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,...

huangpf_vcx 700

JVM&GC面试题

JVM和GC相关面试题解答

学习记录和总结 763

JVM&GC基本知识

JVM&GC基础知识 1.三种基础gc 2.什么是g1 3.g1的四个操作阶段 4 java相关术语 4.1 Millisecond 4.2 Megabyte 4.3 demo获取内存大小(见jvm配置) 4.4 finalization机制(对象终止机制) finalize() 可达状态 可复活状态 不可达状态 4.5 Interned String 确保字符串在内存里只有一份拷贝,节省内存空间 这个内存空间指常量池 ![在这里插入图片描述](https:

weixin_44411398的博客 337

十个问题弄清JVM&GC(一)

每个java开发同学不管是日常工作中还是面试里,都会遇到JDK、JVM和GC的问题。本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面。 JVM、JRE和JDK的区别和联系 JVM是什么?以及它的主要作用 JVM的核心功能有哪些 类加载机制和过程 运行时数据区的逻辑结构 JVM的内存模型 如何确定对象是垃圾 垃圾收集的算法有哪些 各种问世的垃圾收集器 JVM调优的参数配置 1、JVM、JRE和JDK的区别和联系 这个基本是步入java世界的入门级知识认知,首先我们来看一下来自jav

gao2175的博客 484

最详细的JVM&GC讲解

这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的差异也比较大。 不过文中一些JVM参数示例都是实际项目里调优的结果,还是经受过实战考验的。 目录 JVM简介 JVM结构 2.1 方法区 2.1.1 常量池 2.1.1.1 Class文件中的常量池 2.1.1.2 运行时常量池 2.1.1.3 常量池的好处 2.1.1.4 基本类型的包装类和常量池 2.2 堆 2.3 Java栈 2.3.1 栈帧 2.3.

做的过程自我总结 2890

JVM&GC Full Coverage

这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的差异也比较大,因此该文章更适合中、高级工程师阅读,做到名词解释与入门,在大神面前就是献丑了。 不过文中一些JVM参数示例都是实际项目里调优的结果,还是经受过实战考验的。 目录 JVM简介 JVM结构 2.1 方法区 2.1.1 常量池

高广超的博客 777

秋招面试我去了拼多多,直接被问JVM&GC底层原理和算法,我吊打面试官

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。BAT面试经验实战系列:Spring全家桶+Redis等其他相关的电子书:源码+调优面试真题:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2401_83411843的博客 771

【Day17-JVM&GC】

目录 一、JVM 二、GC垃圾回收 三、堆外内存(了解) 一、JVM 1、JVM是运行在操作系统之上的。Scala语言也是运行在JVM之上。 2、JVM其实是一个标准,规范,符合这个规范的软件都可以称之为java 虚拟机。 BEA JRockit --> BEA 有一个服务器非常的有名 WebLogic(tomcat)。 IBM J9 ---> 某某某行业方案解决专家 (IBM小型机)。 3、JVM内存模型 1)ClassLoader 类加载器 所有的java文件,

吾常自闭的博客 938

11.JVM&GC基础

一、JVM基础 1.基础术语 1.1 并行并发 并行 并行是多个线程同时在运行,其发生在多核心 CPU 下,每个 CPU 核心执行一个线程,多个线程同时执行 并发 并发偏重于任务交替执行,但是多个任务之间是串行的,一般指的是一个 CPU 核心的多个线程轮流执行 1.2 进程和线程 进程 每个独立运行的程序都是一个进程,程序和程序之间相互隔离,进程和进程之间也隔离 线程 每个进程内部至少会有一个线程或者多少线程,线程是运行指令的最小单位,每个程序的功能就是由它进程内的所有线程共同完成

u012997514的专栏 458

十个问题弄清JVM&GC(二)

简介: 每个java开发同学不管是日常工作中还是面试里,都会遇到JDK、JVM和GC的问题。本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面。每个java开发同学不管是日常工作中还是面试里,都会遇到JDK、JVM和GC的问题。本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面。 JVM、JRE和JDK的区别和联系 JVM是什么?以及它的主要作用 JVM的核心功能有哪些 类加载机制和过程 运行时数据区的逻辑结构 JVM的内存模型 如何确定对象是垃圾 垃圾收集的算法

阿里云开发者 1303
上一篇: Java并发编程CAS
下一篇: Sentinel入门
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值