欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中double強制轉(zhuǎn)換int引發(fā)的OOM問題記錄

 更新時間:2024年10月23日 09:45:38   作者:冷雨夜中漫步  
這篇文章主要介紹了java中double強制轉(zhuǎn)換int引發(fā)的OOM問題記錄,本文給大家分享問題排查過程,感興趣的朋友跟隨小編一起看看吧

問題代碼

最近出現(xiàn)了一次OOM問題,問題代碼如下

public void prcess(double total, int step) {
	int num = (int) Math.floor(total / step);
	while (num-- > 0) {
		doSomething(); // 普通方法,占用內(nèi)存不大
	}
}

根據(jù)單步步長step將total值劃分后,然后進行處理。然后日志中發(fā)現(xiàn)堆棧在doSomething()時報錯OOM,拋出java.lang.OutOfMemoryError。確認過doSomething()方法不會占用過大的內(nèi)存,那為何會發(fā)生問題?

排查過程

懷疑num過大導(dǎo)致,查看入?yún)otal為合理值,但是step是取配置值,配置未配置時默認為0,則問題代碼為int num = (int) Math.floor(total / step);,這里step為0,Math.floor(total / step) = Infinity,強制轉(zhuǎn)為int后得到值為2147483647。一直在處理此處的邏輯導(dǎo)致內(nèi)存增長,進而發(fā)生OOM

double特殊值與強制轉(zhuǎn)換

java語言中浮點運算存在兩個值:NaN與Infinity

NaN

Not-a-Number,非數(shù)字值,數(shù)學(xué)上0/0是無意義的,java在浮點運算中實現(xiàn)了NaN,定義為0.0/0.0。NaN有如下幾個特點:

NaN與任何數(shù)字都不相等,NaN與其本身也不相等

System.out.println(Double.NaN == Double.NaN); // false
System.out.println(Double.NaN == 0.0/0.0); // false
System.out.println(Double.NaN == 0.0); // false

使用Double.isNaN或Float.isNaN確認是否為NaN

System.out.println(Double.isNaN(0.0/0.0));  // true
System.out.println(Float.isNaN(0.0f/0.0f));  // true

NaN與任何數(shù)字比較都是false

System.out.println(Double.NaN > 0.0); // false
System.out.println(Double.NaN < 0.0); // false

Infinity

無限,分為正無限與負限小,定義為一個非0數(shù)字除以0。

有如下幾個特點:

正無限與負無限定義

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

無限與任何非無限非0數(shù)字運算仍為無限

System.out.println(Double.POSITIVE_INFINITY + Double.MAX_VALUE); // Infinity
System.out.println(Double.POSITIVE_INFINITY - Double.MAX_VALUE); // Infinity
System.out.println(Double.POSITIVE_INFINITY * Double.MAX_VALUE); // Infinity
System.out.println(Double.POSITIVE_INFINITY / Double.MAX_VALUE); // Infinity
System.out.println(Double.NEGATIVE_INFINITY + Double.MIN_VALUE); // -Infinity
System.out.println(Double.NEGATIVE_INFINITY - Double.MIN_VALUE); // -Infinity
System.out.println(Double.NEGATIVE_INFINITY * Double.MIN_VALUE); // -Infinity
System.out.println(Double.NEGATIVE_INFINITY / Double.MIN_VALUE); // -Infinity

無限與0運算為無限或NaN

System.out.println(Double.POSITIVE_INFINITY / 0); // Infinity
System.out.println(Double.POSITIVE_INFINITY * 0); // NaN
System.out.println(Double.NEGATIVE_INFINITY / 0); // -Infinity
System.out.println(Double.NEGATIVE_INFINITY * 0); // NaN

負無限與正無限運算為無限或NaN

System.out.println(Double.POSITIVE_INFINITY + Double.NEGATIVE_INFINITY); // NaN
System.out.println(Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY); // Infinity
System.out.println(Double.NEGATIVE_INFINITY + Double.POSITIVE_INFINITY); // NaN
System.out.println(Double.NEGATIVE_INFINITY - Double.POSITIVE_INFINITY); // -Infinity
System.out.println(Double.POSITIVE_INFINITY * Double.NEGATIVE_INFINITY); // -Infinity
System.out.println(Double.POSITIVE_INFINITY / Double.NEGATIVE_INFINITY); // NaN
System.out.println(Double.NEGATIVE_INFINITY * Double.POSITIVE_INFINITY); // -Infinity
System.out.println(Double.NEGATIVE_INFINITY / Double.POSITIVE_INFINITY); // NaN

無限強制轉(zhuǎn)換為整形會有精度丟失

System.out.println((int)Double.POSITIVE_INFINITY); // Integer.MAX_VALUE
System.out.println((int)Double.NEGATIVE_INFINITY); // Integer.MIN_VALUE
System.out.println((long) Double.POSITIVE_INFINITY); // Long.MAX_VALUE
System.out.println((long)Double.NEGATIVE_INFINITY); // Long.MIN_VALUE

到此這篇關(guān)于java中double強制轉(zhuǎn)換int引發(fā)的OOM問題的文章就介紹到這了,更多相關(guān)java強制轉(zhuǎn)換double轉(zhuǎn)int內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java計算兩點間的距離方法總結(jié)

    java計算兩點間的距離方法總結(jié)

    小編給大家總結(jié)了在java中計算兩點之家距離的方法以及相關(guān)實例代碼分享,有需要的讀者參考下。
    2018-02-02
  • JavaWeb開發(fā)中alias攔截器的使用方法

    JavaWeb開發(fā)中alias攔截器的使用方法

    本文給大家介紹在JavaWeb開發(fā)中alias攔截器的使用方法相關(guān)知識,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-08-08
  • Java微信公眾平臺開發(fā)(4) 回復(fù)消息的分類及實體的創(chuàng)建

    Java微信公眾平臺開發(fā)(4) 回復(fù)消息的分類及實體的創(chuàng)建

    這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第四步,回復(fù)消息的分類及實體的創(chuàng)建,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • SpringBoot-RestTemplate如何實現(xiàn)調(diào)用第三方API

    SpringBoot-RestTemplate如何實現(xiàn)調(diào)用第三方API

    這篇文章主要介紹了SpringBoot-RestTemplate實現(xiàn)調(diào)用第三方API的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis foreach用法解析--對于list和array

    Mybatis foreach用法解析--對于list和array

    這篇文章主要介紹了Mybatis foreach用法解析--對于list和array,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中transient關(guān)鍵字用法分析

    java中transient關(guān)鍵字用法分析

    這篇文章主要介紹了java中transient關(guān)鍵字用法,以實例形式分析了java中transient關(guān)鍵字的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • spring boot 自定義規(guī)則訪問獲取內(nèi)部或者外部靜態(tài)資源圖片的方法

    spring boot 自定義規(guī)則訪問獲取內(nèi)部或者外部靜態(tài)資源圖片的方法

    這篇文章主要介紹了spring boot 自定義規(guī)則訪問獲取內(nèi)部或者外部靜態(tài)資源圖片的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java Vector實現(xiàn)班級信息管理系統(tǒng)

    Java Vector實現(xiàn)班級信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java Vector實現(xiàn)班級信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java中幾種常用加密算法盤點

    Java中幾種常用加密算法盤點

    隨著互聯(lián)網(wǎng)的發(fā)展,信息安全問題日益受到重視,加密算法在保證信息安全傳輸方面發(fā)揮著重要作用,本文將簡要盤點幾種常用的Java加密算法,介紹它們的基本原理、特點及應(yīng)用情況,以幫助讀者全面了解當(dāng)前加密算法的發(fā)展?fàn)顩r,需要的朋友可以參考下
    2023-11-11
  • IDEA中Translation使用及問題解決

    IDEA中Translation使用及問題解決

    本文主要介紹了IDEA中Translation使用及問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論