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