Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在java中,整数只能作为小于128(默认值)的值的实习生_Java_Performance_Memory - Fatal编程技术网

为什么在java中,整数只能作为小于128(默认值)的值的实习生

为什么在java中,整数只能作为小于128(默认值)的值的实习生,java,performance,memory,Java,Performance,Memory,我知道,对于小于128的值(默认值),整数就像实习生一样,而对于大于128的值,则不一样。我知道这已经作为一个答案给出了很多次,但我没有注意到一个地方被问到原因 所以我想知道的是,为什么整数只对小于128的值(默认值)起实习生的作用,而对大于128的值不起实习生的作用?它如何提高更少的内存使用率/高性能?从技术上讲,这些值是在加载类时预缓存的。它不像String.intern()那样可以返回您创建的值 此外,最大值可能不是127,如果将其设置为127或使用类似于-XX:+AggressiveOp

我知道,对于小于128的值(默认值),整数就像实习生一样,而对于大于128的值,则不一样。我知道这已经作为一个答案给出了很多次,但我没有注意到一个地方被问到原因


所以我想知道的是,为什么整数只对小于128的值(默认值)起实习生的作用,而对大于128的值不起实习生的作用?它如何提高更少的内存使用率/高性能?

从技术上讲,这些值是在加载类时预缓存的。它不像String.intern()那样可以返回您创建的值

此外,最大值可能不是127,如果将其设置为127或使用类似于
-XX:+AggressiveOpts

选择默认范围可能只是为了与字节一致。注意:缓存的值是

Boolean: both values
Byte: all
Character: 0 to 127
Short: -128 to 127
Integer: -128 to 127
Long: -128 to 127
Float and Double: none
BigInteger: -16 to 16 (in HotSpot Java 7)
BigDecimal: 0 to 10 (if you use valueOf(long)) and 
            0 to 0.000000000000000 (if you use valueOf(long, int)) (in HotSpot Java 7)
这样做的原因是为了提高性能和降低GC压力

创建垃圾会让你的缓存充满垃圾,降低你所有代码的速度。创建对象和清理它们也需要一些工作。你做的工作越少,你的程序就会越快,越一致


下面是一篇很好的文章,介绍了它所带来的不同

从技术上讲,在加载类时,值是预缓存的。它不像String.intern()那样可以返回您创建的值

此外,最大值可能不是127,如果将其设置为127或使用类似于
-XX:+AggressiveOpts

选择默认范围可能只是为了与字节一致。注意:缓存的值是

Boolean: both values
Byte: all
Character: 0 to 127
Short: -128 to 127
Integer: -128 to 127
Long: -128 to 127
Float and Double: none
BigInteger: -16 to 16 (in HotSpot Java 7)
BigDecimal: 0 to 10 (if you use valueOf(long)) and 
            0 to 0.000000000000000 (if you use valueOf(long, int)) (in HotSpot Java 7)
这样做的原因是为了提高性能和降低GC压力

创建垃圾会让你的缓存充满垃圾,降低你所有代码的速度。创建对象和清理它们也需要一些工作。你做的工作越少,你的程序就会越快,越一致

下面是一篇很好的文章,介绍了它所带来的不同

当然,不希望缓存所有整数值。因为,这意味着当JVM启动时,它必须生成超过40亿个整数对象,这些对象很可能不适合当代计算机的内存

因此,必须决定缓存一些较小数量的整数(如果有的话)。这个数字应该足够小,这样就不会出现内存使用或启动速度较慢的情况。OTOH,它应该涵盖尽可能多的情况。没有读过任何关于这方面的研究,但根据经验,我们可以自信地说,非常小的整数是最常用的

因此,缓存128个数字的决定完全是任意的,但仍然有意义。也可能是30或300。但肯定不是一百万

这对性能有什么帮助?好吧,它为小数字提供了自动装箱功能,因为不必构造整数,而是通过单个memroy访问从缓存(很可能是整数[128]数组)中选择一个。同时,众所周知,许多整数都是短命的。使用不需要垃圾收集的预分配对象可以消除GC的压力。

如下所示:

当然,不希望缓存所有整数值。因为,这意味着当JVM启动时,它必须生成超过40亿个整数对象,这些对象很可能不适合当代计算机的内存

因此,必须决定缓存一些较小数量的整数(如果有的话)。这个数字应该足够小,这样就不会出现内存使用或启动速度较慢的情况。OTOH,它应该涵盖尽可能多的情况。没有读过任何关于这方面的研究,但根据经验,我们可以自信地说,非常小的整数是最常用的

因此,缓存128个数字的决定完全是任意的,但仍然有意义。也可能是30或300。但肯定不是一百万


这对性能有什么帮助?好吧,它为小数字提供了自动装箱功能,因为不必构造整数,而是通过单个memroy访问从缓存(很可能是整数[128]数组)中选择一个。同时,众所周知,许多整数都是短命的。使用不需要垃圾收集的预分配对象可以消除GC的压力。

请参阅intern范围是-128到127(与
字节相同)。这是一个设计决定。原因可能是您只需要一个字节来存储它,并且大多数整数常量都是这个范围内的小数字。请参阅intern范围是-128到127(与
字节
相同)。这是一个设计决定。原因可能是您只需要一个字节来存储它,而大多数整数常量都是这个范围内的小数字。非常感谢您的精彩解释。也谢谢你的文章+非常感谢你的精彩解释,彼得。也谢谢你的文章+1ed。