JAVA中动态类加载的性能代价

JAVA中动态类加载的性能代价,java,tomcat,dynamic-class-loaders,Java,Tomcat,Dynamic Class Loaders,我使用定制版本的Tomcat开发应用程序。 有对动态类加载的支持,我在测试和开发环境中经常使用动态类加载,我也很好奇在生产环境中使用动态类加载的影响 据我所知,由于性能问题,由于类加载器在每次访问时轮询类,所以动态类加载不能用于生产 但是,此应用服务器支持配置用于加载新类的轮询频率 如果我理解正确,如果我将动态类加载配置为每隔相当长的时间(即1小时)轮询一次,我应该避免最不利的性能影响 在生产中,这种机制将以有限的方式使用: 1) 无需用户停机的紧急修补(第一次停机时将发布修补程序) 2) 我们

我使用定制版本的Tomcat开发应用程序。 有对动态类加载的支持,我在测试和开发环境中经常使用动态类加载,我也很好奇在生产环境中使用动态类加载的影响

据我所知,由于性能问题,由于类加载器在每次访问时轮询类,所以动态类加载不能用于生产

但是,此应用服务器支持配置用于加载新类的轮询频率

如果我理解正确,如果我将动态类加载配置为每隔相当长的时间(即1小时)轮询一次,我应该避免最不利的性能影响

在生产中,这种机制将以有限的方式使用:
1) 无需用户停机的紧急修补(第一次停机时将发布修补程序)
2) 我们没有来源的类的永久修补(遗留第三方LIB)

这是一个可靠的解决方案吗

谢谢

如果不知道您的“定制Tomcat版本”是什么,显然很难判断您是否正确理解它。然而,是的,如果它按照tin上说的做,你将避免大多数不利影响

对于Emergency Pachting之类的东西,当您可以使用下面描述的Tomcat Manager应用程序时,为什么还要等待一个小时才能重新加载类呢

如果您想将此功能用于紧急修补或generell修补,我强烈建议在需要时使用Tomcat Manager应用程序触发重新加载:

可重新加载

如果希望Catalina监视中的类,请设置为true /WEB-INF/classes/和/WEB-INF/lib进行更改,并自动 如果检测到更改,请重新加载web应用程序。此功能是 在应用程序开发期间非常有用,但需要 运行时开销大,不建议在上使用 已部署的生产应用程序。这就是为什么默认设置为 此属性为false。您可以使用Manager web应用程序, 但是,在需要时触发已部署应用程序的重新加载


我认为您不应该在生产中使用该功能
除了轮询开销之外,可能还有许多其他场景不会在开发环境中造成问题

我想到的事情很少是

  • 对编译期间内联的任何常量的影响
  • 对perm空间的影响
  • 您无法跟踪在生产环境中部署的版本
  • 在补丁过程中可能会出现诸如丢失类文件之类的错误

  • 我没有听说过“投票频率”,所以我不知道你是从哪里得到的。使用Tomcat Manager应用程序在需要时触发重新加载不是更容易吗?这是“定制版Tomcat”的一个功能,它实际上更像是一个更大的应用服务器,它使用Tomcat作为其部分功能。我不确定每小时重新加载类会带来什么好处,当你需要的时候也可以通过Manager重新加载它们。Tomcat是以某种模糊的方式集成的,我不知道是否可以触发重新加载,所以我在考虑在持续轮询和夜间发布之间进行折衷。能够告诉客户“一小时内补丁就会上线”比“等到明天再让补丁上线”要好。无论如何,我将探索触发重新加载的可能性。这是一个相当模糊的第三方应用服务器,它在内部某处使用tomcat。我仍然要确定是否是tomcat自己管理类加载。啊,传统软件的苦涩味道……部署一场新的战争真的需要那么长时间吗?考虑到basiljames列出的所有问题,我建议重新启动,而不是尝试破解某种热部署,或者如果它真的那么重要,那么请使用一个集群,在其中一次更新一个。停机不是一个真正的选项,太多的用户在太多不同的位置。集群,我想从来没有尝试过这个应用服务器。这就是我寻找替代方案的原因。1和2可能会有问题,3和4我认为可以通过实施发布策略来解决。谢谢你指出这些问题。