【个人学习】JVM(12):垃圾回收相关概念

news2024/9/22 23:24:58

垃圾回收相关概念

System.gc() 的理解

  1. 在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。

  2. 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)

  3. JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,**无须手动触发,否则就太过于麻烦了。**在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()

代码示例:手动执行 GC 操作

public class SystemGCTest {
   
    public static void main(String[] args) {
   
        new SystemGCTest();
        System.gc();//提醒jvm的垃圾回收器执行gc,但是不确定是否马上执行gc
        //与Runtime.getRuntime().gc();的作用一样。

//        System.runFinalization();//强制调用使用引用的对象的finalize()方法
    }
    //如果发生了GC,这个finalize()一定会被调用
    @Override
    protected void finalize() throws Throwable {
   
        super.finalize();
        System.out.println("SystemGCTest 重写了finalize()");
    }
}

输出结果不确定:有时候会调用 finalize() 方法,有时候并不会调用

SystemGCTest 重写了finalize()
或
空

手动 GC 理解不可达对象的回收行为

//加上参数:  -XX:+PrintGCDetails
public class LocalVarGC {
   
    public void localvarGC1() {
   
        byte[] buffer = new byte[10 * 1024 * 1024];//10MB
        System.gc();
    }

    public void localvarGC2() {
   
        byte[] buffer = new byte[10 * 1024 * 1024];
        buffer = null;
        System.gc();
    }

    public void localvarGC3() {
   
        {
   
            byte[] buffer = new byte[10 * 1024 * 1024];
        }
        System.gc();
    }

    public void localvarGC4() {
   
        {
   
            byte[] buffer = new byte[10 * 1024 * 1024];
        }
        int value = 10;
        System.gc();
    }

    public void localvarGC5() {
   
        localvarGC1();
        System.gc();
    }

    public static void main(String[] args) {
   
        LocalVarGC local = new LocalVarGC();
        //通过在main方法调用这几个方法进行测试
        local.localvarGC1();
    }
}

JVM参数:

-Xms256m -Xmx256m -XX:+PrintGCDetails -XX:PretenureSizeThreshold=15m

1、第四个参数是设置大对象直接进入老年代的阈值,由于我的电脑8G和视频里老师的电脑16G不太一样。我测试的时候10M的数组都是直接进入到了老年代,为了保持一样的效果,我同时设置了堆内存和大对象阈值,尽量和宋红康老师保持一致

2、我也查过了大对象阈值的默认值

我不太懂这个默认值为啥是0,我猜测可能是代表什么比例,目前也没有搜到相关的东西。这个不太重要,暂时就没有太深究,希望读者有知道的可以告知我一声。

看不懂GC日志请看笔者的 那篇文章

1、调用 localvarGC1() 方法

执行 System.gc() 仅仅是将年轻代的 buffer 数组对象放到了老年代,buffer对象仍然没有回收

[GC (System.gc()) [PSYoungGen: 15492K->10728K(76288K)] 15492K->11000K(251392K), 0.0066473 secs] [Times: user=0.08 sys=0.02, real=0.01 secs] 
[Full GC (System.gc()) [PSYoungGen: 10728K->0K(76288K)] [ParOldGen: 272K->10911K(175104K)] 11000K->10911K(251392K), [Metaspace: 3492K->3492K(1056768K)], 0.0097940 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 76288K, used 655K [0x00000000fab00000, 0x0000000100000000, 0x0000000100000000)
  eden space 65536K, 1% used [0x00000000fab00000,0x00000000faba3ee8,0x00000000feb00000)
  from space 10752K, 0% used [0x00000000feb00000,0x00000000feb00000,0x00000000ff580000)
  to   space 10752K, 0% used [0x00000000ff580000,0x00000000ff580000,0x0000000100000000)
 ParOldGen       total 175104K, used 10911K [0x00000000f0000000, 0x00000000fab00000, 0x00000000fab00000)
  object space 175104K, 6% used [0x00000000f0000000,0x00000000f0aa7d08,0x00000000fab00000)
 Metaspace       used 3498K, capacity 4498K, committed 4864K, reserved 1056768K
  class space    used 387K, capacity 390K, committed 512K, reserved 1048576K

2、调用 localvarGC2() 方法

由于 buffer 数组对象没有引用指向它,执行 System.gc() 将被回收

[GC (System.gc()) [PSYoungGen: 15492K->808K(76288K)] 15492K->816K(251392K), 0.0294475 secs] [Times: user=0.00 sys=0.00, real=0.04 secs] 
[Full GC (System.gc()) [PSYoungGen: 808K->0K(76288K)] [ParOldGen: 8K->640K(175104K)] 816K->640K(251392K), [Metaspace: 3385K->3385K(1056768K)], 0.0054210 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型的超参数含义: Top-P 采样; Top-P 采样;logit_bias:

目录 大语言模型的超参数含义 Top-P 采样 频率惩罚(Frequency Penalty) top_k: logit_bias: top_logprobs: max_tokens: 大语言模型的超参数含义 Top-P 采样 含义:一种采样替代方法,称为核采样。模型考虑top_p概率质量的token结果。例如,0.1表示仅考虑组成前10%…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(四)- 3GPP Release18内容

一、引言: 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划,是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析(一&#xff…

2166. 子树的大小及深度

代码 #include<bits/stdc.h> using namespace std; vector<int> a[110]; int d[110],s[110]; int dfs(int x,int y) {int i;s[x]1;d[x]d[y]1;for(i0;i<a[x].size();i)if(a[x][i]!y)s[x]s[x]dfs(a[x][i],x);return s[x]; } int main() {int n,x,y,i;cin>>…

字符集介绍

在计算机科学中&#xff0c;字符集 (Character Set) 是指一组用于表示文本中字符的集合。字符集通过特定的编码方式&#xff0c;将字符与其在计算机内存或存储设备中的二进制表示联系起来。字符集在文本处理、文件传输、网络通信等场景中起着至关重要的作用。 1. 字符与编码的…

Redis(13)| 缓存与数据库数据一致性问题

本文讨论的前提&#xff1a; 不是一个事务&#xff0c;永远无法满足数据库和缓存的强一直性的;文中会列举不一致的逻辑场景;一定是依解决业务问题&#xff0c;和业务达成的共同目标为前提&#xff1b; 前言 只要用到多数据源存储同一份相同的数据&#xff0c;在更新时&#…

计算方法——插值法程序实现(一)

例题 给出的函数关系表&#xff0c;分别利用线性插值及二次插值计算的近似值。 0.10.20.30.40.51.1051711.2214031.3498591.4918251.648721 参考代码一&#xff1a;Python代码实现&#xff08;自编码&#xff09; import math """ :parameter用于计算插值多项…

linux-基础知识2

目录和文件的权限 修改目录和文件的拥有者 用root用户执行&#xff1a; chown -R 用户:组 目录和文件列表 -R选项表示连同各子目录一起修改 创建aa目录mkdir aa ,查看 ls -l 普通用户没有权限&#xff0c;不能删除 转移权限&#xff0c;chown -R mysal:deb /aa/aa 加上-R…

ModuleNotFoundError: No module named ‘cv2‘,python

ModuleNotFoundError: No module named cv2&#xff0c;python 报错如同&#xff1a; 解决方案&#xff1a; pip install opencv-python https://blog.csdn.net/zhangphil/category_9486298.html

陀螺仪LSM6DSV16X与AI集成(12)----SFLP获取四元数

陀螺仪LSM6DSV16X与AI集成.12--SFLP获取四元数 概述视频教学样品申请源码下载硬件准备SFLP生成STM32CUBEMX串口配置IIC配置CS和SA0设置ICASHE修改堆栈串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程初始化SFLP步骤初始化SFLP读取四元数数据 概述 在现代的运动跟踪…

World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone

Sapphire Hive Drone 蓝玉虫巢雄蜂 蓝玉虫巢巨峰 索拉查盆地 实用性不强&#xff0c;好看是好看&#xff0c;模型很大&#xff0c;无奈栏位太少

面相对象的成员介绍

2.面相对象的成员 -> 类: a.类的定义&#xff1a; 1.类是对公共特点的抽象&#xff0c;其中包含了很多成员&#xff0c;如属性&#xff08;成员变量 &#xff09;、方法、构造器等.要想很好的定义类&#xff0c;就必须要好好的了解这些类的成员 b.访问修饰符 控制属性的…

stm32开发之rt-thread使SysTick处于微妙级运行时,出现的问题记录

前言 在使用rt-thread开发时&#xff0c;想将调度的时间间隔缩短到微妙级别。根据提示需要修改对应的宏定义即可。这里在修改宏定义时&#xff0c;发现进入中断太过频繁&#xff0c;以至于主逻辑一直无法执行。这里测试的环境如下: 相关环境介绍 开发工具使用的是CLION测试开…

《编译原理:编程语言的幕后魔法师》

《编译原理&#xff1a;编程语言的幕后魔法师》 在计算机科学的宏伟殿堂中&#xff0c;编译原理犹如一位神秘而强大的魔法师&#xff0c;默默地施展着魔法&#xff0c;将人类可读的编程语言转化为计算机能够理解的机器语言。它是连接高级编程语言和计算机硬件的重要桥梁&#…

机器学习周报(8.26-9.1)

文章目录 摘要Abstractself-attetionQKV理解如何让self-attention更有效local attention/truncated attention方法stride attention方法Global Attention方法data driving方法Clusteringsinkhorn sorting network选取representative keys减少Keys数量的方法self-attentionSynth…

光电红外传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main.c文件 HW.h文件 HW.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 光电传感器对环境光线适应能力强,其具有一对红外线发射与接收管&#xff0c;发射管发射出一定频率的红外线&#xff…

企业邮箱申请步骤

一家企业如果希望建立专业形象、提高内外部沟通效率&#xff0c;申请并配置一个企业邮箱是至关重要的一步。下面详细介绍企业邮箱申请的步骤&#xff0c;以确保您的企业能够顺利拥有一个高效、安全的电子邮件系统。 第一步&#xff1a;确定需求和选择邮箱服务提供商 在开始申请…

Docker培训

基本概念 容器是一种轻量级、可移植、自包含的软件打包技术&#xff0c;由两部分组成&#xff1a;应用程序、依赖环境。通过标准格式打包应用的所有代码和依赖关系&#xff0c;确保应用能够快速、可靠地在计算环境下运行。 当容器启动时&#xff0c;一个新的可写层被加载到镜…

Day90 代码随想录打卡|贪心算法篇---合并区间

题目&#xff08;leecode T56&#xff09;&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。…

中英翻译,就看这五款工具!

大家好&#xff0c;今天咱们来聊聊翻译工具。作为一个经常需要和英文打交道的小编&#xff0c;我可是试过不少翻译软件。今天就来跟大家聊聊5款工具在翻译英文上的表现&#xff0c;看看谁才是真正的翻译高手&#xff01; 一、福昕翻译在线 网址&#xff1a;https://fanyi.pdf3…

【物理教学】不准确温度计图像代码分享

这段Python代码用于绘制温度计校准的图像。它包括以下功能&#xff1a; 用户输入&#xff1a;允许用户输入温度计在冰水混合物和沸水中的读数&#xff0c;以及一个实际温度值。 计算校准因子&#xff1a;根据用户输入的冰水混合物和沸水的读数&#xff0c;计算温度计的校准因子…