我通常使用 Spring Boot + JPA + Hibernate + Postgres。
在 Web 应用程序开发结束时,我在 Jar 中编译,然后直接使用 Java 运行它,然后使用 Apache (httpd) 进行反向代理。
我注意到启动时没有任何问题或延迟,访问网站时它运行得非常快,但是当几个小时过去了没有人向服务器发出请求然后我想访问时我必须等待至少 20等待服务器响应,之后我可以继续正常访问该网站。
为什么会发生这种情况?,就好像Spring每次检测到没有负载请求时都处于待机模式,但我不确定是这样还是有问题。如果它是一些原生的 spring 功能,我该如何禁用它?
虽然我需要在空闲状态下使用更多的内存,但我希望无论加载与否,答案都能很快。
最佳答案
在不了解更多信息的情况下,很可能当您的 Web 应用程序闲置时,服务器上的其他程序正在使用内存并导致 JVM 内存交换到磁盘。
当您再次访问 Web 应用程序时,操作系统必须将 JVM 内存交换回 RAM,一次一页。这需要时间,但是一旦内存返回 RAM,您的 Web 应用程序就会正常运行。
不幸的是,根据 Java 内存的工作方式,将 JVM 内存交换到磁盘对性能非常不利。对于大多数依赖垃圾收集器释放内存的语言来说,这是一个问题。具有手动内存管理功能的语言,例如当内存交换到磁盘时,C++ 代码通常不会受到那么严重的影响,因为这些语言中的内存使用更加“集中”。
解决方案:如果我对问题原因的猜测是正确的,请重新配置您的服务器,这样 JVM 内存就不会交换到磁盘。
请注意,当我说服务器时,我指的是物理机。 JVM 争夺内存的“其他程序”可能运行在不同的虚拟机中,即不在同一个操作系统中。
关于java - 为什么Spring Boot WEB响应速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894990/