提案详情
有一些常见的“错误”(或错失的机会)会导致堆大小增加:
- 读取大量内存,然后通过
[]byte
/string
仅引用其中的一些位(取决于分离) - 在读取一些数据后产生大量重复的字符串(取决于内部化)
- 结构体中的对齐填充(取决于字段重新排序)
- 也许我们可以找到更多的机会
潜在的运行时可能会进行昂贵的分析(为了简单起见,可以从 STW 开始),并使用这些错失的机会生成一个性能分析报告。具体来说,在对象级别上运行堆标记(仅标记/扫描可达部分的对象);运行完整的堆复制分析(按对象大小/类型/内容进行哈希),然后将此与堆分析数据相交并输出交集。
这可能提供一种非常节省成本的优化堆大小的方法。例如,这个栈分配了 N GB,其中 99% 是不可达的,或者这个栈分配了 M GB 的重复字符串等。
4条答案
按热度按时间7vhp5slm1#
抱歉,如果这个已经被提议/讨论过了,我没有关注最近的发展。
ctehm74n2#
这听起来像是gocore的一个很好的用例(参见#57447)。
daupos2t3#
我同意,我想这会使实施变得更容易。
t1rydlwq4#
我对于将如此昂贵的物品(包括与除P数量之外的其他事物成比例的STW)作为
runtime/pprof.Profile
暴露出去感到不安。另外,通过gocore进行离线分析时加1。