首页 > 编程知识 正文

java基本类型溢出,java int 溢出

时间:2023-12-27 22:27:26 阅读:326084 作者:XHOU

本文目录一览:

java中的溢出问题

(1)这你要理解基本类型之间的相互转换还有8中基本类型所占的位数;

除去boolean外;byte8位,char16位,double 64,folat 32,int 32,

lang 64;short 16;

其中 byte,char,short可以自动转换为int;

byte,int,short,可以自动转换为double;

byte,int,double,shotr可以自动转换为double/folat因为double和folat可应用科学计数发表示无穷大;

整形默认类型是int值为0;

浮点数默认类型为double值为0.0;

下面说一说溢出:

例如 byte i=3;是错误的;

因为3是int型,而i是byte,JVM(java虚拟机)认为int型赋给byte越界了。

byte i=(byte)3;进行强制类型转换才行;

同理 folat i=3.0;也是错的;

folat i=(folat)3.0或i=3.0f;

还有:

byte i1=(byte)1;

byte i2=i1+i2;也是错的

因为在”+“过之后i1+i2自动转换成int型,所以不能赋给i3;

但是 byte i2+=i1;是对的

因为它只是在执行完i2+=i1;之后还是把byte型赋给了byte型;

java内存溢出的问题如何排查

java程序大家都知道,内存溢出是经常见的错误,下面从基本的开始分析!

内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:

一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;

二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)

三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)

四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。

五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。

六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。

如String s1 = "My name";

String s2 = "is";

String s3 = "xuwei";

String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的

但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。

在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。

知道原因了,解决起来就非常简单了。

JAVA 内存溢出的几种类型

主要有三种类型

1.OutOfMemoryError: PermGen space

发生这种问题的原因java虚拟机装载类的空间不够,与Permanent Generation space有关。可以通过增加java虚拟机中的XX:PermSize XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。

2.OutOfMemoryError: Java heap space

发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收时,虚拟机分配的堆内存空间已经满了,与Heap space有关。可以通过增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。 -Xms256m -Xmx1024m

3.OutOfMemoryError:unable to create new native thread

在Java线程数很多的情况下易发生

java内存溢出怎么解决?

第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,

1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。

2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类,

算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。

3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。

1),变量所包含的对象体积较大,占用内存较多。

2),变量所包含的对象生命周期较长。

3),变量所包含的对象数据稳定。

4),该类的对象实例有对该变量所包含的对象的共享需求。

4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。

第二还有就是String类相关的东西:

1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。

2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。

int size = xmlVector.size();

for (int i = 2; i size; i++) {

。。。

}

3 写代码的时候处理内存溢出

try{

//do sth

....

}catch (outofmemoryerror e){//可以用一个共通函数来执行.

system.out.print (“no memory! ”);

system.gc();

//do sth again

....

} 4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。 Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。

java 溢出是什么意思

你说的这个溢出属于数值范围溢出,low和high都是int型,int类型由它定义的变量的数值范围是有限的,想必你也知道,你在执行(low+high)/2的时候,求和操作可能使求和后的结果大于int类型所能表示的数值范围,这样就会产生数据溢出。改为减,可以避免。不过我觉得这样的情况仅发生在high和low的数值都很大的情况下。其实没必要考虑这样的问题,若溢出,会有异常提醒你,一般的int足够你用了,嫌小改为long。欢迎大家一起讨论

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。