当前位置: 首页 > 面试题库 >

是什么使热部署成为“难题”?

元叶秋
2023-03-14
问题内容

在工作中,“
PermGen内存不足
”异常一直存在问题,团队负责人认为这是JVM中的错误-
与代码热部署有关。他没有解释很多细节,但指出热部署是一个“难题”,它是如此艰苦,以至于.NET都还没有做到这一点。

我发现有很多文章从鸟瞰的角度解释了热部署,但始终缺乏技术细节。谁能指出我的技术解释,并解释为什么热部署是一个“难题”?


问题答案:

加载类时,有关该类的各种静态数据都存储在PermGen中。只要存在对这个Class实例的实时引用,就不能对该类实例进行垃圾回收

我认为部分问题与GC是否应从perm
gen中删除旧的Class实例有关。通常,每次热部署时,都会将新的类实例添加到PermGen内存池中,而通常不会删除现在未使用的旧类实例。默认情况下,Sun
JVM将不会在PermGen中运行垃圾回收,但是可以使用可选的“ java”命令参数启用它。

因此,如果您热部署足够的时间,最终将耗尽PermGen空间。

如果你的web应用程序不会关闭 完全 取消部署时-如果它离开正在运行的线程,例如-
那么所有由该Web应用程序使用的类的实例将在PermGen的空间被固定。您重新部署,现在将所有这些Class实例的另一个完整副本加载到PermGen中。您取消部署后,线程继续运行,在PermGen中固定了另一组类实例。您重新部署并加载整个净副本集…最终您的PermGen填满了。

您有时可以通过以下方法解决此问题:

  • 向最新的Sun JVM提供命令参数以启用PermGen和类中的GC。那是: -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  • 使用不使用固定大小的PermGen或对加载的类进行GC的其他JVM

但这 在您的Web应用程序完全干净地关闭且没有任何动态引用的情况下 才有用
,该实时引用指向该Web应用程序的Class加载程序加载的任何Class的任何Class实例。

由于类加载器泄漏,即使这样也不一定能解决问题。(在某些情况下还有太多的固定字符串。)

请查看以下链接以获取更多信息(两个粗体的链接都有漂亮的图表来说明问题的一部分)。

  • 类加载器泄漏:可怕的“ java.lang.OutOfMemoryError:PermGen空间”异常
  • 未知的一代:彼尔姆
  • 介绍永久的一代
  • Tomcat Wiki:如何处理内存不足错误


 类似资料:
  • 问题内容: 我想以集成方式设置eclipse和tomcat,这样就可以立即反映对JSP和servlet(如果可能)的更改,而无需进行部署。 好的,这是在整个互联网上都有很多答案的那些问题之一,但是它们似乎都不同。(使用Sysdeo插件,使用JBOss插件,使用过时的Eclipse进行操作,改用MyEclipse等),我找不到要引用的1个权威性资源。因此,出于我的利益,最简单,最推荐的设置程序是什么

  • 应用更新部署无需reload或者restarthi-nginx。hi-nginx-java能根据全局配置 route { lrucache { reflect { expires = 300 size = 1024 } } } 自动实现热更新。关键值由"route.lrucache.reflect.e

  • 1、成倍提高系统承载能力并降低成本 单机遇到资源瓶颈时,要想支持更大的用户量,一般是优化业务和增加服务器配置。然而这么做只能是杯水车薪,成本巨大并且效果非常有限。 GatewayWorker支持分布式部署,你可以利用多台价格低廉的普通服务器,组成一个庞大的服务器集群,成倍的增加系统承载能力,这不管在资金成本上还是人力成本上都是最划算的方案。 2、提高系统稳定性 单机对外提供服务,则风险很大,服务器

  • 本文向大家介绍SPDY 是什么? 如何部署 SPDY?,包括了SPDY 是什么? 如何部署 SPDY?的使用技巧和注意事项,需要的朋友参考一下 左边是普通 HTTPS 加载,右边是 SPDY 加载。是不是很神奇? SPDY 是什么 ? SPDY 是 Google 开发的基于传输控制协议 (TCP) 的应用层协议 ,开发组正在推动 SPDY 成为正式标准(现为互联网草案)。SPDY 协议旨在通过压缩

  • 在Eclipse中,我创建了Tomcat服务器,并将我的应用程序添加到参考资料中。JSP、JS、CSS和JAVA类hot deploy就是这样工作的。 在IntelliJ中,我配置了Tomcat8服务器。在Deployment选项卡中,我添加了我启用了对,还启用了。JSP、JS、CSS热交换就是这样工作的。Java类不是。 我还检查了 我知道我可以使用JRebel,但是在Eclipse中hot d

  • 通常在使用AWS RDS时,实现高可用性的推荐实践是在不同的AZ中部署热副本(多AZ部署)。此外,还可以创建一些读取副本来提高读取性能。 我读过AWS Aurora文档,它使用公共虚拟存储层,在3个AZ上复制,每个AZ有两个副本。 我的问题是:如果Aurora本身能够自愈,并且存储分布在多个AZ,那么是否需要使用Aurora DB集群的Amazon MultiAZ部署?如果它在3个AZ中各保留2个