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

应用程序启动后,Java应用程序中的所有.class文件都加载到内存中了吗?,java,android,Java,Android,我正在为Android制作一个应用程序,在我的活动中,我需要加载大约10000个字符串的数组。从数据库加载它很慢,所以我决定将它直接放入一个.java文件(作为一个私有字段)。我有大约20个包含字符串数组的类,我的问题是,在我的应用程序启动后,是否所有的类都加载到内存中?如果是这样,我需要这些字符串的活动将很快加载,但整个应用程序的启动速度会很慢。。。 还有其他方法吗,如何从文件中快速加载10000个字符串数组 更新: 为什么我需要这些绳子?我的Android应用程序可以让你在布拉格的公共交通中

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

更新:
为什么我需要这些绳子?我的Android应用程序可以让你在布拉格的公共交通中找到“旅程”——你选择出发站、到达站,它会找到你的旅程(看看)。我的应用程序有一个建议功能-你输入leter“c”作为出发站,建议列表视图显示以“c”开头的站。对于这些建议,我需要字符串。从数据库中获取建议的速度很慢(G1上约400ms)。

只有在第一次引用类时才会加载该类

虽然需要10000个数组,但可能不需要一次完成所有任务。这就是分页概念的由来。此链接表示.initial在内存中只有少量数组,如果需要,请继续将其加载到内存中,并从内存中卸载以前的任何数据

例如,在任何表格中,用户一次最多可以看到50条记录,然后他将不得不滚动(考虑到他的屏幕不是
iMax电影院的大小)。当他滚动时,加载下一个数据块并卸载用户现在不可识别的任何数据

何时加载类型?这是一个 令人惊讶的棘手问题 回答。这在很大程度上是由于 所提供的巨大灵活性, 根据JVM规范,到JVM 实现。装载必须是 在链接和链接之前执行 必须在 初始化。VM规范确实如此 规定时间 初始化。它严格要求 在其上初始化类型 首次主动使用(参见附录A了解详细信息 构成“活动”的内容列表 使用“)。这意味着加载(和 必须执行类型的链接 在该类型的第一个活动 使用


中,我不认为您会对维护10K字符串感到满意,这些字符串是在Java文件中硬编码的

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

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

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


您可以为每个字符预加载,比如说10个条目。如果键入了一个字符,您可以先预加载该字符,然后再加载另一个字符,以此类推。

首先,400毫秒执行一个简单的数据库查询非常慢。速度如此之慢,以至于我怀疑您的数据库模式(例如索引)或数据库连接配置中存在一些问题

但是,如果您真的不想使用数据库,那么除了您目前正在做的事情之外,还有两种选择:

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

  • 将10000个字符串转换成一个平面文件,将该文件放入应用程序的JAR文件中。然后使用
    Class.getResourceAsStream(…)
    打开文件并将其读入内存阵列

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


  • 大多数Android设备都缺少主内存,如果可能的话,我会动态生成这些字符串。如果你在列表中显示它们,ListView+CursorAdapter也会动态加载它们。对于这种基本情况,Android上的SQLite不应该有任何性能问题。我更新了我的问题,这应该可以回答您的评论。不幸的是,我需要所有10000个(请参阅更新的问题)。因此,如果我的活动代码中有类名,JVM会在我的活动启动时加载该类?不确定android,但sun JVM会延迟加载。该类将在首次使用时初始化。e、 当某些代码第一次实际使用类中的静态值或对其调用new时。只是导入它什么也不做,如果在执行路径中没有调用NEW或MyClass.staticMethod(),那么它就永远不会被加载。我很确定Android运行时也会这样做。谢谢,现在我使用Class.forName(“”),而且速度非常快。