在一些常量中将一个常量加载到jvm中

时间:2016-06-28 06:04:48

标签: java memory constants static-members

在我的代码中,我必须使用一些常量值,所以我创建了一个实用程序类

div[ui-view].ng-enter {
    /*...ENTER-STYLES*/
}
div[ui-view].ng-enter-active {
    /*...ENTER-ACTIVE-STYLES*/
}

但我喜欢2000个恒定值,我不会在我的应用程序中使用所有这些值,但它们应该作为选择。问题是当我使用实用程序类时,所有变量都是静态变量,所有字符串值都加载到jvm。

2000常数分为6类。我尝试使用6个静态类,但仍然是相同的。当jvm找到一个静态类时,它会将每个静态变量加载到内存中。

与字符串常量内存相比,我真正使用的所有常量内存,我不会使用它加载到jvm中的内存要大得多。

问题:如何在所有这些常量中仅将单个常量加载到内存中。

4 个答案:

答案 0 :(得分:3)

只是为了确定:你问这个是因为你正在做一些“嵌入式”项目;而你遇到了记忆问题;并且您进行了分析/分析,并发现在您的应用程序中使用这些2000字符串是一个问题吗?因为:如果你没有做到这一点 - 是什么让你认为你实际上有一个问题需要你花时间在它上面?

并且附注:仅有的事实是你有2000个常数;其中许多“未使用”...非常表明你应该更少担心这种设计对内存消耗的影响;但在设计本身。

老实说,这首先在“可能不是一个非常好的设计”方面闻起来很糟糕。

答案 1 :(得分:2)

您可以创建属性文件。这些是简单的文本文件,您可以在其中存储键值对并使用标准Java类对其进行解析:Properties

然后您只能加载所需的文件。你说你把你的价值分为6类。您可以创建6个文件,并在需要时只加载您需要的文件。

答案 2 :(得分:1)

这是经常看到的做法。

  • 在团队中,它会导致不必要的版本控制周期/合并。
  • 编译器将在使用源中导入类本身中的常量,而.class中的常量将不再驻留常量类的导入。因此,如果常量接收另一个值,则使用类中仍会保留一个过时的值(需要手动清理+构建)。
  • 新代码被分为两个地方,这些地方尽可能不“流动”,也用于搜索和阅读。

正如你所提到的那样,可以通过定义类/接口/枚举的几个常量来缓解这个问题。

存在替代品(在某种程度上)。 JAXB允许在XML和Java对象之间进行编组。

@XmlAttribute("surname")
public String surname; // <... surname="...">

上面的注释可以删除,因为该字段具有确切的名称。 顺便说一句:不要为注释值引入常量,因为可以处理注释。

这显示了两种引入常量的方法,我添加了枚举:

  • 通过注释 - 可在java中处理
  • 通过反射(尽管效率低)
  • by enum:enum Category1 { name1, name2 }

不可否认,它必须适合用例。

业务逻辑似乎是最大的问题:许多小域和特定于案例的代码来处理业务规则。域值可以从数据库生成为枚举(反之亦然)。

答案 3 :(得分:-2)

基本上,在加载类时,JVM会加载所有静态变量并将其保存到内存中。如果您只想按需加载常量。您必须使用系统命令编写某些逻辑并从Java代码调用。或者将所有常量移动到文件中,并在需要时检索所需的常量。但是表现明智并不是那么好。