Java 启动应用程序时如何加载所有资源?

Java 启动应用程序时如何加载所有资源?,java,optimization,resources,Java,Optimization,Resources,Java根据需要加载资源。这使得我的小型桌面应用程序在打开窗口时非常慢 启动应用程序时如何加载所有资源?是否与类加载器相关 编辑:如果文件在jar中,是否工作 EDIT2:注意,目的不是减少启动时间,而是减少应用程序启动后打开新窗口的时间。我希望所有资源都进入内存并保持“随时可用”,这样在加载应用程序后,用户的命令会运行得更快。问题更难:如果使用代码,代码会被初始化,这甚至可以在方法级别上看到。所以你必须运行它来加载它 唯一的其他可能性是购买ExcelsiorJet,它为您执行编译步骤(并返回一

Java根据需要加载资源。这使得我的小型桌面应用程序在打开窗口时非常慢

启动应用程序时如何加载所有资源?是否与类加载器相关

编辑:如果文件在jar中,是否工作


EDIT2:注意,目的不是减少启动时间,而是减少应用程序启动后打开新窗口的时间。我希望所有资源都进入内存并保持“随时可用”,这样在加载应用程序后,用户的命令会运行得更快。

问题更难:如果使用代码,代码会被初始化,这甚至可以在方法级别上看到。所以你必须运行它来加载它

唯一的其他可能性是购买ExcelsiorJet,它为您执行编译步骤(并返回一个漂亮的.exe作为副作用)


编辑:您可以按类减少运行时。forName()在启动期间加载所有类,并在需要时加载所有内容。请注意,为了让一切都非常快,代码必须已经运行,所以您可能可以打开但隐藏所有窗口,关闭它们,然后真正显示打开所有其他窗口的主窗口。不幸的是,这会让你的应用程序启动非常缓慢。但是它甚至可以在后台完成,而用户决定下一步要做什么。

如果您指的是类文件以外的其他资源,那么您可以使用延迟加载(延迟加载),直到您真正需要这些资源

Java根据需要加载资源

事实上,它比这更复杂。如果有一个类
a
静态地依赖于一个类
B
静态地依赖于一个类
C
,那么加载
a
将触发对
B
C
的快速加载,依此类推。但是一些库(我认为AWT和Swing可以做到这一点)在内部使用
Class.forName(…)
方法惰性地加载实现类。这减少了最初加载的类的数量,并且(理想情况下)避免加载应用程序永远不会使用的代码

启动应用程序时如何加载所有资源


我认为您可以创建显式静态依赖项来克服上述惰性,但这可能不会使应用程序的初始窗口显示得更快。更好的策略是尝试使用更多的延迟加载,以减少需要加载的代码量,从而使初始窗口可见。但这需要明智地进行。如果您懒散地加载初始窗口所需的类,实际上可能会降低启动速度

编译为本机代码(例如使用GCJ)是另一种选择,但这有各种缺点;e、 更大的二进制文件,更多的本机库依赖,可移植性问题,(可能)长时间运行的应用程序执行速度较慢


重新编辑:我认为代码会“起作用”,但我不认为它可能加速应用程序的启动。

在Windows 7上,Java应用程序客户端也有类似的问题。任何扩展任何Gui(Frame、JFrame等)的操作都将从只需几秒钟的时间开始,开始需要一分钟的时间来运行和加载

追踪到在后台运行的IIS(更新后?)

从控制面板\程序\程序和功能停止其服务-打开和关闭Windows功能

现在Java应用程序将在几秒钟内再次加载


希望其他人觉得这有帮助。:-)

您是否尝试过与JConsole连接,并查看在打开窗口时到底发生了什么?如果它是一个与类加载相关的瓶颈,那么您将在“类的数量”图上清楚地看到它。否则,您也可以尝试更改JVM设置,这可能是内存不足或“-server”JIT模式well@bobah我所有的桌面应用程序都会出现这种情况,不仅仅是这个。有没有一种方法可以在不显式写入名称的情况下迭代所有类?目的不是减少启动时间,请看我的第二次更新,我想做的正好相反,在启动时加载所有资源,以便在需要时可以在内存中快速访问。“更好的策略是尝试使用更延迟的加载,以减少需要加载的代码量,从而使初始窗口可见”。事实上,我并不关心初始窗口的显示速度慢,我关心的是,在显示之后,所有其他窗口都需要准备好以快速方式显示。我希望所有的资源加载到内存中,以便在应用程序启动时快速访问。(它不会耗尽内存,因为它是一个小应用程序)。你问过你的用户吗?他们也是这么想的吗?无论如何-如果你认为这样做是正确的,那么按照我的建议添加静态依赖项。我看到他们在使用它,等待应用加载没有问题。但是,在应用程序加载后,等待你的每一次点击,这是一个非常令人头痛的问题……)我想我不太明白。。使用Class.forName()会减少最初加载的类的数量吗?因为我想要的是在显示初始屏幕时加载所有类/资源。在我回答的第一段中,我解释了静态依赖如何导致类被急切地加载。然后写了“我想你可以创建显式的静态依赖来克服上面的懒惰……”。现在清楚了吗?