我经常在Java程序中使用常量,然而,当查看反编译的Java类文件时,我注意到整个程序中常量的所有用法都被它们的文字值所取代,而类顶部的原始声明和赋值仍然存在,我想知道这些变量是否只是坐在那里浪费内存,因为它们在文件中的任何地方都没有使用.如果有一种方法可以将常量限制在编译时,并在类文件生成后将其删除.
我经常在Java程序中使用常量,然而,当查看反编译的Java类文件时,我注意到整个程序中常量的所有用法都被它们的文字值所取代,而类顶部的原始声明和赋值仍然存在,我想知道这些变量是否只是坐在那里浪费内存,因为它们在文件中的任何地方都没有使用.如果有一种方法可以将常量限制在编译时,并在类文件生成后将其删除.
在这种情况下,编译器足够智能,可以有效地使用内存.而且,即使假设您每个常量都浪费了内存,让我们来做一个实际的思考实验,看看这可能有多大的"空间".
假设我们混合了字符串、int和其他基本类型.在Java中,字符串中的每个字符是2个字节,而int是4个字节.假设我们有75,000个字符常量和25,000个整型常量. 这是75k*2,所以150k字节或~150k字节的内存用于字符串常量 对于25k*4或100k的INT,大约有100千字节的内存.
因此,总共有~250kb.
如今你能买到的最基本的电脑至少有4 GB的内存,更有可能是8 GB到16 GB.
因此250kb/4000000kb*100=最低规格现代计算机的0.00625.
现在,如果你正在运行一些微控制器或其他有限的硬件,它可能是什么东西,但即使这样,它也是值得怀疑的,你可能没有使用Java.
作为一般的经验法则,编译器和解释器往往非常擅长他们的工作,对于大多数程序员和程序来说,相信他们在大多数时间做正确的事情就足够了.
有时,某些模式(如大量创建新对象,然后触发垃圾回收或其他类似问题)可能会对性能产生很大影响.
关键是要知道语言/计算机/使用模式中的实际瓶颈和问题所在.
一旦我们进入分布式空间和大规模,情况确实会变得更加复杂--但同样,除非您在这种环境中工作,否则通常不需要考虑它.
将您的期望集中在您的用例上,如果您正在为只有少数人使用的东西优化10毫秒的yield ,这可能是浪费时间--除非您这样做是为了好玩.