我经常在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 ,这可能是浪费时间--除非您这样做是为了好玩.

Java相关问答推荐

在applitcation.properties中找到的字符串中输入变量

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

JUnit—如何模拟局部变量对象方法调用

Jlink选项&-strie-ative-Commands";的作用是什么?

为什么在枚举中分支预测比函数调用快?

JPanel透支重叠的JComcoBox

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

如何在EXCEL单元格中添加形状和文本

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

在应用程序运行时更改LookAndFeel

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

如何使用jooq更新记录?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

由于可为null,无法在kotlin中实现java接口

如何以事务方式向ibmmq发送消息

获取401未经授权,即使在标头中设置了浏览器名称和cookie