Java根据需要加载资源。这使得我的小型桌面应用程序在打开窗口时非常慢。
启动应用时如何加载所有资源?是否与类加载器有关?
编辑:如果文件在jar中,this code是否有效?
EDIT2:请注意,目的不是减少启动时间,而是减少启动应用程序后新窗口打开的时间。我希望所有资源都能进入内存并保持“准备就绪”,因此加载后应用程序将更快地运行用户的命令。
答案 0 :(得分:2)
Java根据需要加载资源。
实际上,它比这更复杂。如果您的班级A
静态地依赖于静态依赖于班级B
的班级C
,则加载A
会触发渴望加载B
和C
等等。但是一些库(我认为AWT和Swing这样做)在内部使用Class.forName(...)
方法来延迟加载实现类。这个减少了最初加载的类的数量,并且(理想情况下)避免加载应用程序永远不会使用的代码。
如何在启动应用时加载所有资源?
我认为您可以创建显式静态依赖项来消除上面的懒惰,但这可能不会使您的应用程序的初始窗口显示得更快。更好的策略是尝试使用更多延迟加载来减少需要加载的代码量以使初始窗口可见。但这需要明智地完成。如果你懒得加载初始窗口所需的类,你实际上可能会使启动变慢。
编译为本机代码(例如使用GCJ)是另一种选择,但这有各种缺点;例如更大的二进制文件,更多本机库依赖项,可移植性问题,(可能)长时间运行的应用程序执行速度较慢。
重新编辑:我认为代码会“正常工作”,但我不知道它是如何加速应用程序启动的。
答案 1 :(得分:0)
问题更难:如果使用了代码,则会对代码进行初始化,即使在方法级别也可以看到。所以你必须运行它来加载它。
唯一的另一种可能性是购买Excelsior Jet,它为您完成编译步骤(并返回一个很好的.exe作为副作用)。
编辑:您可以在启动期间通过Class.forName()减少运行时所有类,并在需要时加载所有类。请注意,为了让一切都非常快,代码必须已经运行,所以也许你可以打开但隐藏所有窗口,关闭它们,然后真正显示所有其他窗口打开的主窗口。可悲的是,这将使你的应用程序启动真的很慢。但它甚至可以在后台完成,而用户则决定下一步该做什么。
答案 2 :(得分:0)
如果你的意思是其他资源而不是类文件,那么你可以使用proxy pattern来延迟加载(延迟加载),直到你真正需要资源。
答案 3 :(得分:0)
在Windows 7上,与Java Applications Client Side有类似的问题。任何扩展任何Gui(Frame,JFrame等等)的东西都会花费一分钟来运行并加载只需几秒钟。
将其追溯到在后台运行的IIS(更新后?)。
从控制面板\程序\程序和功能中停止其服务 - 打开和关闭Windows功能。
现在Java应用程序再次加载了几秒钟。
希望其他人觉得这很有帮助。 : - )