草庐IT

memory-management - Go(lang) 内存使用 : RSIZE growing and VSIZE of 139GB?

coder 2023-06-26 原文

我正在用 Go 编写我的第一个网络服务器/网络服务程序 我意识到 RSIZE(如命令行程序“top”所示)在对我的网络服务重复相同的请求后增长。这是否意味着存在内存泄漏?

我还注意到我的应用程序和“顶部”的 go 进程都有 139GB 的 VSIZE(两者都恰好是这个大小)。正常吗?

我在 OS X 10.8 上使用 Go 1.1.2

非常感谢

最佳答案

大 VSIZE 并不意味着您真的在使用物理内存;不会担心的。

RSIZE 在单个请求后增长也并不令人担忧。 RAM 通过垃圾收集回收,这会消耗 CPU 周期,因此 Go 和其他 GC 语言会等待很多请求,直到它们需要释放 RAM(或者至少直到分配了大量 RAM)才能运行收集。更少的集合 => 更少的 CPU 时间。

通常意义上的泄漏很少见,因为 GC 最终应该释放您没有引用的内存。如果您有根据需要增长但从不收缩的缓冲区,那么这些缓冲区可能会产生类似泄漏的效果,并且如果您不小心持有对真正死亡的内存的引用,您可能会遇到问题。但除非这个过程永远保持增长,否则我不会假设你在这里遇到了这个问题。

这里有一些 Go 的内存管理技巧;有些也间接适用于其他语言:

  • 您通常不需要担心。收集通常非常快,并且相对于数据的大小,您通常有很多 RAM 可供使用。在你潜入之前,确保有一个问题需要解决。 :)
  • runtime.ReadMemStats(ms)可以告诉您您的程序在 GC 中花费了多长时间,以及许多其他有用的信息,例如您分配了多少(请参阅 http://golang.org/pkg/runtime/ 处的 runtime 模块文档)
  • 如果您在 GC 上花费了太多时间并且不知道为什么,下一步是 memprofile; Go 博客上有一个完整的例子,涉及给程序一个可选的 -memprofile 标志:http://blog.golang.org/profiling-go-programs
  • 一般来说,您可以通过减少不必要的分配来减少 GC,尤其是大对象的分配(例如,保存整个 HTTP 响应的缓冲区)。
    • 有时有一些自然的方法可以做到这一点而不会使您的程序复杂化——您可以将输出流式传输到 Writer 而不是缓冲大的响应,或者在循环的多次迭代中重用一个对象例如,每次分配。
    • 其他时候,您可以回收大型/经常分配的对象,而不是制作新对象;标准sync.Pool package 对此有所帮助,并且有一个很好的回收的一般描述(从 sync.Pool 成为标准之前)on the CloudFlare blog .

关于memory-management - Go(lang) 内存使用 : RSIZE growing and VSIZE of 139GB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080637/

有关memory-management - Go(lang) 内存使用 : RSIZE growing and VSIZE of 139GB?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  4. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  5. ruby-on-rails - 如何将大于 5GB 的文件上传到 Amazon S3? - 2

    我目前正在使用带有Carrierwavegem的Rails3.2将文件上传到AmazonS3。现在我需要能够处理用户提交的大于5GB的文件,同时仍然使用Carrierwavegem。Carrierwave或Fog是否有任何其他gem或分支可以处理5GB以上的文件上传到S3?编辑:我不想重写一个完整的Rails上传解决方案,所以像这样的链接没有帮助:https://gist.github.com/908875. 最佳答案 我想出了如何做到这一点,并且现在可以正常工作了。在正确的config/environment文件中,添加以下内容以

  6. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  7. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  8. ruby-on-rails - 内存中具有相同 ID 的更多对象? - 2

    在部署在heroku上的Rails应用程序(v:3.1)中,我在内存中获得了更多具有相同ID的对象。我的heroku控制台日志:>>Project.find_all_by_id(92).size=>2>>ActiveRecord::Base.connection.execute('select*fromprojectswhereid=92').to_a.size=>1这怎么可能?可能是什么问题? 最佳答案 解决方案根据您的SQL查询,您的数据库中显然没有重复条目。也许您的类项目中的size或length方法已被覆盖。我试过find_

  9. ruby - rails 3.0.7 内存泄漏 - 2

    我的两个不同的Rails应用程序的内存有一些奇怪的问题。这两个应用程序都使用rails3.0.7。每个Controller请求分配20-30-50MB的内存。在生产模式下,这个数量减少到5-10。但这是同样的事情。这是两个应用程序使用的gem列表:gem'pg'gem'haml'gem'sass'gem'devise'gem'simple_form'gem'state_machine'gem"globalize3","0.1.0.beta"gem"easy_globalize3_accessors"gem'paperclip'gem'andand'关闭所有这些gem不会给我任何结果。我

  10. ruby - 如何强制 Ruby 释放内存给操作系统 - 2

    正如标题,我有一个处理大量数据的ruby​​程序。该程序占用了所有内存,其中调用了系统命令hostname,并且发生错误无法分配内存-主机名我试过GC.start但它不起作用。那么如何强制ruby释放未使用的内存呢?OK,这是别人的测试代码,最后报错是big_var被回收了。但是内存仍然没有释放。require"weakref"defreportputs"#{param}:\t\tMemory"+`psax-opid,rss|grep-E"^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1].to_s+'KB'endbig_var=""#big

随机推荐