gpt4 book ai didi

java - 具有巨大字符串响应的 Tomcat 性能

转载 作者:行者123 更新时间:2023-11-29 03:41:53 24 4
gpt4 key购买 nike

我有一个 springRest web 服务端点,它返回一个大小为 4MB 的字符串文本。当我们对该端点进行负载测试时,我们不断看到堆峰值并最终导致系统崩溃。我在想 - 当我们发出请求时,每个请求都由一个线程单独提供服务。我的假设是:因为字符串保存在一个全局静态变量中,每个线程都会获取 4MB 的副本,并且在大约 3000 个请求之后,堆全部消耗完并且系统崩溃,因为 3000 个线程占用每个 4MB 大约是 12GB,因此系统内存不足。但这是我的假设。

我的问题:tomcat 不会在每个处理请求的线程完成其工作后回收内存吗?这与GC(垃圾收集)有关吗?在请求生命周期中——当一个请求到来时,一个线程被创建(根据该请求)线程是否获得它自己的响应副本或者它只是引用响应?如果那个巨大的字符串响应被复制到每个线程,那么可能就是堆峰值出现的原因。当响应返回给客户端时,tomcat如何回收该线程的资源?它什么时候做的?声明请求线程是否与 GC 相关?

我观察到的另一个方面是:延迟方法 socketWrite0() - 这占用了 70-95% 的响应时间。我认为这是一个瓶颈。那么在请求响应的流程中——谁写入套接字?线程?或者线程将响应交给 tomcat 并由 tomcat 写入?

如果你们中的任何人能给我一个提示或一个方面来研究内存峰值与巨大的字符串响应之间的关系,我将非常感激。谢谢大家!

玫瑰

最佳答案

如果您声明了一个静态最终字符串,则该变量应该在线程之间共享。没有任何代码,几乎不可能说出发生了什么。

您是否尝试过使用像 JProfiler 这样的分析工具?或 mat

关于java - 具有巨大字符串响应的 Tomcat 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12787275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com