首页 > 其他分享 >一个小技巧,巧妙的使用 sync.Pool 减少 GC 压力,提升性能!

一个小技巧,巧妙的使用 sync.Pool 减少 GC 压力,提升性能!

时间:2024-09-14 12:24:00浏览次数:16  
标签:对象 sync stu GC student New Pool


Go 语言的 sync.Pool 本质是用来保存和复用临时对象,以减少内存分配,降低 GC 压力,比如需要使用一个对象,就去 Pool 里面拿,如果拿不到就分配一份,这比起不停生成新的对象,用完了再等待 GC 回收要高效的多。

sync.Pool 是临时对象池,存储的是临时对象,不可以用它来存储 socket 长连接和数据库连接池等。

sync.Pool 小案例

sync.Pool 的使用很简单,看下示例代码:

package student

import (
 "sync"
)

type student struct {
 Name string
 Age  int
}

var studentPool = &sync.Pool{
 New: func() interface{} {
  return new(student)
 },
}

func New(name string, age int) *student {
 stu := studentPool.Get().(*student)
 stu.Name = name
 stu.Age = age
 return stu
}

func Release(stu *student) {
 stu.Name = ""
 stu.Age = 0
 studentPool.Put(stu)
}

当使用 student 对象时,只需要调用 New() 方法获取对象,获取之后使用 defer 函数进行释放即可。

stu := student.New("tom", 30)
defer student.Release(stu)

// 业务逻辑
...

那么问题来了,关于 sync.Pool 里面的对象具体是什么时候真正释放?这个是由系统决定的。

标签:对象,sync,stu,GC,student,New,Pool
From: https://blog.51cto.com/u_15183360/12015800

相关文章

  • 【YashanDB知识库】YAS-02025 no free space in virtual memory pool
    本文转自YashanDB官网,具体内容请见[https://www.yashandb.com/newsinfo/7304719.html?templateId=1718516]【标题】YAS-02025nofreespaceinvirtualmemorypool【问题分类】业务SQL执行【关键字】YAS-02025【问题描述】在崖山环境查询数据提示报错YAS-02025nofreespa......
  • SpringCloud-04 OpenFeign服务调用与负载均衡
    OpenFeign是一个声明式、模板化的HTTP客户端,它简化了在Java应用程序中调用RESTfulAPI的过程。OpenFeign是Netflix开发的一个开源项目,它构建在Feign的基础上,为开发者提供了更加简单、灵活的方式来实现HTTP请求。OpenFeign的特点包括:前面在使用SpringCloudLoadBalancer+Res......
  • oracle之spool详细使用总结
    一、通过spool命令,可以将select数据库的内容写到文件中,通过在sqlplus设置一些参数,使得按指定方式写到文件中(1)常规使用spool方法,将set的一些命令和spool,select等放入.sql脚本中,然后再sqlplus中运行该脚本。以下为logmnr.sql脚本,在sqlplus中执行@logmnr.sql就可以写入文件record......
  • Executors.newCachedThreadPool()的使用
    //线程池privatefinalExecutorServiceexecutorService=Executors.newCachedThreadPool();executorService.submit(()->orderDecrypt(meituanOrderInfoExp));@Transactional@OverridepublicvoidorderDecrypt(MeituanOrderInfoExpmeituanOrderInfoExp......
  • [AGC003F] Fraction of Fractal
    题意给定一个由黑白组成的网格。保证黑子四联通。规定一次操作为使用最初的网格图替换当前网格图的所有黑色格子。操作\(k\)次。问最终有多少个黑色连通块,对\(10^9+7\)取模。\(k\le10^{18}\)。Sol先不难注意到这个东西只和原网格图是否左右联通和上下联通有关......
  • 【运维平台】WGCLOUD基本使用 - 系统判定主机下线的原理是什么
    只要被控主机的agent超过5分钟没有上报监测数据,系统就会判定该主机下线......
  • 使用 `Roslyn` 分析器和修复器 对异步方法规范化返回Async结尾
    之前写过一篇使用修复器帮助添加头部注释文本的功能,今天使用Roslyn的代码修复器对异步返回方法规范化的功能实现分析器首先需要实现分析器,使用RegisterSyntaxNodeAction,分析所有SyntaxKind.MethodDeclaration的语法类型,[DiagnosticAnalyzer(LanguageNames.CSharp)]public......
  • Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sq
    前言我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)》利用langchain中create_sql_agent创建一个数据库代理智能体,但是实测中发现,使用create_sql_agent在对话中,响应速度太慢了,数据的表越多,对话响应就越慢,这次本篇文章l......
  • docker配置springcloud项目到服务器
    1.服务器安装部署docker镜像2.创建镜像目录,如图所示 以其中一个服务为例,每个文件夹对应一个服务单元,每个文件夹中包含 sh,Dockerfile文件3.编辑项目中的application-test(根据环境来定),如图:   4.配置Nacos,单独配置命名空间,增加配置文件,注意,组一定要是test,配错了系......
  • Java 并发编程深度解析:synchronized 关键字的内部原理与应用
    引言在并发编程中,当多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。Java是通过synchronized关键字实现锁功能来做到这点的,synchronized是JVM实现的一种内置锁,锁的获取和释放由JVM隐式实现。锁的本质如上图所示,多个线程要访问同一个资源。线程就......