JAVA数值越界在内存中是怎么处理的?比如:byte b = 129 ,怎么转?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA数值越界在内存中是怎么处理的?比如:byte b = 129 ,怎么转?相关的知识,希望对你有一定的参考价值。
这个是涉及到内存溢出,直接写byte b = 129肯定是报错的,如果强转就不一样了结果是-127,因为byte的范围在Java中的定义就是1个字节,即表示数在 -127~128,一共是256个数字,内存溢出就是简单来说就像一个轮子,这个byte型的轮子就是把这256个数字连成一个圈,128后面的数字就是-127,也就是128+1就变成了它的最小数-127,-127-1就变成了它的最大数128,这就跟我们的时钟是一样的,23的下一个时间是0,0的前面是23,其他的数值类型也是这样的。你设定一个超范围的数字时比较一下它比这个数值类型的最大值或者最小值,看它小多少或者大多少就可以推出来了。另外前面的朋友说的补码就是专业点的说法,我这种没有从机器码的角度解释。 参考技术A byte b = (int)129129写成整数的二进制形式在内存中的存储是:
00000000 00000000 00000000 10000001
因为byte占1个字节,强制转换时,取低字节 10000001,这存储的时补码,转换成原码就是11111111,就是-127.
再举一个例子。byte b = (int)255,
在内存中的存储是:
00000000 00000000 00000000 11111111,取低位之后,b在内存中的补码是11111111,转换为原码是-1
所以,现在你明白了吧。强制转换是取低位字节。和c,c++一样。 参考技术B 首先在java中,你这么写就在编译就会报错;要么你把byte改成int
要么把129强转成byte;这样你的b实际上就是-127;内存中你要是强行转成byte;具体流程:
129=10000001但是符号位是1也就是说是负数;负数在存储的时候是以补码的形式存储;所以10000001-1=>10000000,然后再按位取反10000000取反,符号位不动10000000=>11111111=>-127; 参考技术C byte b = 129;是错误的,智能提示你无法转换。明显感知到129已经超过了byte范围。你可以:byte b = (byte)129;因为编程了10000001(补码,最高位1表示负数;反码是:10000000,原码:11111111,不算最高位,那么是-127) 参考技术D 通常的处理是往高字节的类型转换,比如转换成int
首先你使用一个数据的时候最好要确定它的使用范围是多少,对症下药,了解各个数据类型的范围是多少。
如果超出所有数据类型的范围,那么可以使用BigDecimal,它可以达到精确计算,另外还可以用NumberFormat类的format()方法对数据进行格式化控制
Jmeter中outofmemoryError内存溢出、数组越界等问题汇总
参考技术A 问题1 、Jmeter中报如下java.lang.outofmemoryError内存溢出错误,一般是配置文件有问题:jmeter运行的时候要提前给它分配好内存,因为分配的内存不足所以报错解决方法:
在Jmeter\apache-jmeter-2.13\bin\jmeter.bat,点击编辑HEAP和NEW参数,保存后就不会内存溢出。
set HEAP=-Xms256m -Xmx256m
set
NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
set NEW指的是每个线程占用的内存,假如一台机要产生1000个线程,一个请求请求的数据为200K,那么这里就要设置“1000*200/1024=195.32”,内存要设置128的倍数,那么这里就要设置“256m”
set HEAP指的是累积线程占用的内存,建议是new的4倍
setPERM=-XX:PermSize=1024m -XX:MaxPermSize=1024m 默认是64m,当我访问200k的设置100并发时,遇到三四次,jmeter控制器没停掉,聚合报告数据也不动了,把控制器的jmeter.bat文件里的设置改成1024m就正常了,未知原因!
问题2 、数组越界问题,Jmeter中报如下java.lang.ArrayIndexOutOfBoundsException
此问题是问题1中设置HEAP和NEW参数错误
问题3 、压测过程中总是遇到部分请求报NoHttpResponseException:The target server failed to respond错误,无法达到错误率0%
解决办法:
1)修改jmeter.properties文件中httpclient4.idletimeout超时的时间
如改为:httpclient4.idletimeout=60000
2)修改执行计划中,HTTP请求的Implementation选择HttpClint4,保存执行计划
3)在循环的请求中去掉Use KeepAlive的勾选项
以上是关于JAVA数值越界在内存中是怎么处理的?比如:byte b = 129 ,怎么转?的主要内容,如果未能解决你的问题,请参考以下文章