应用程序启动后,我的Java应用程序中的所有.class文件是否都加载到内存中?

时间:2010-02-03 12:07:15

标签: java android

我正在为Android制作应用程序,在我的Activity中我需要加载一个大约10000个字符串的数组。从数据库加载它很慢,所以我决定将它直接放入一个.java文件(作为私有字段)。我有大约20个这样的类包含字符串数组,我的问题是,我的应用程序启动后是否所有类都加载到内存中?如果是这样,我需要快速加载我需要这些字符串的Activity,但整个应用程序启动会很慢...... 还有其他方法,如何从文件中快速加载10000字符串数组?

更新 为什么我需要这些字符串?我的Android应用程序允许您在布拉格的公共交通中找到“旅程” - 您选择出发站,到达站点并找到您的旅程(看看here)。我的应用程序有一个建议功能 - 您输入leter“c”作为您的出发站点,并出现建议ListView,其中以“c”开头的停靠点。对于这些建议,我需要字符串。从数据库中获取建议很慢(G1上大约400ms)。

4 个答案:

答案 0 :(得分:4)

首先,执行简单数据库查询的400ms非常慢。如此缓慢以至于我怀疑数据库模式(例如索引)或数据库连接配置存在问题。

但是如果你认真对待不使用数据库,那么你现在正在做的事情有几种选择:

  1. 使用Class.forName(...)安排包含数组的类根据需要延迟加载。如果你正确实现它,垃圾收集器应该可以在加载后回收类并将字符串添加到主数据结构中。

  2. 将10000个字符串转换为平面文件,将文件放入应用程序的JAR文件中。然后使用Class.getResourceAsStream(...)打开文件并将其读入内存数组。

  3. 如上所述,但使用索引文件并将数组替换为允许您懒惰地从文件中读取字符串的数据结构。 (这会有点复杂,但是如果你担心10000字符串消耗的内存,这将有助于解决这个问题。)

答案 1 :(得分:3)

只有在首次引用类时才会加载它。

虽然您需要一个10000的数组,但您可能不需要同时使用所有数组。这里是分页概念的用武之地。这个链接指示Paging is often done in Android。最初在内存中只有少量数组,并且根据需要,继续将其加载到内存中并从内存中卸载任何先前的数据如果不想要的话。

例如在任何一张桌子中,用户最多可以看到50条记录,然后他必须滚动(考虑到他的屏幕不是iMax movie theatre的大小)。当他滚动时,加载下一个数据块并卸载现在对用户不可用的任何数据。

答案 2 :(得分:1)

  

何时加载类型?这是一个   令人惊讶的棘手问题   回答。这在很大程度上是由于   提供了显着的灵活性,   通过JVM规范,到JVM   实现。必须加载   在链接和链接之前执行   必须在之前进行   初始化。 VM规范确实如此   规定时间   初始化。它严格要求   一个类型在其上初始化   首次有效使用(参见附录A)   什么构成“活跃的   使用“)。这意味着加载(和   必须执行一种类型的链接)   在该类型的第一个活动时或之前   使用

来自http://www.developer.com/java/other/article.php/2248831/Java-Class-Loading-The-Basics.htm

答案 3 :(得分:0)

我认为您不会对使用Java文件进行硬编码的10K字符串感到满意。

而是检查您是否正在为您的问题使用正确的数据库,以及您的索引是否设置正确。错误的索引可能会导致性能非常差。

此外,您应该限制查询返回的结果数量,但请确保您不会逐个获取条目。

如果不适合,您仍然可以在启动时从数据库预加载字符串。

你可以为每个角色预加载,比方说10个条目。如果键入了一个字符,您可以预先加载具有该字符的条目,依此类推。