最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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。確認(rèn)過doSomething()方法不會占用過大的內(nèi)存,那為何會發(fā)生問題?

排查過程

懷疑num過大導(dǎo)致,查看入?yún)otal為合理值,但是step是取配置值,配置未配置時默認(rèn)為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確認(rèn)是否為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

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

有如下幾個特點:

正無限與負(fù)無限定義

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

負(fù)無限與正無限運算為無限或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)文章

  • 關(guān)于java編譯過程中的bug說明

    關(guān)于java編譯過程中的bug說明

    本篇文章是對java編譯過程中的bug進行了詳細(xì)的說明介紹,需要的朋友參考下
    2013-05-05
  • JAVA使用隨機數(shù)實現(xiàn)概率抽獎

    JAVA使用隨機數(shù)實現(xiàn)概率抽獎

    這篇文章主要為大家詳細(xì)介紹了JAVA使用隨機數(shù)實現(xiàn)概率抽獎,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • springboot如何配置ssl支持https

    springboot如何配置ssl支持https

    在SpringBoot應(yīng)用中配置SSL支持HTTPS需要創(chuàng)建KeyStore并在application.yml中進行相應(yīng)配置,首先,使用java的keytool工具創(chuàng)建KeyStore,這涉及到設(shè)置密鑰對、指定密鑰算法(RSA)、密鑰大小(2048位)、密鑰庫名稱、證書有效期等,創(chuàng)建KeyStore后
    2024-10-10
  • Spring Schedule Task動態(tài)改寫Cron配置方式

    Spring Schedule Task動態(tài)改寫Cron配置方式

    這篇文章主要介紹了Spring Schedule Task動態(tài)改寫Cron配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 數(shù)據(jù)定位在java購物車系統(tǒng)中的應(yīng)用

    數(shù)據(jù)定位在java購物車系統(tǒng)中的應(yīng)用

    實現(xiàn)"加入購物車"功能,數(shù)據(jù)定位至關(guān)重要,它通過用戶ID和商品ID等標(biāo)識符實現(xiàn)快速查詢和數(shù)據(jù)一致性,主鍵、外鍵和聯(lián)合索引等數(shù)據(jù)庫技術(shù),以及Redis緩存和并發(fā)控制策略如樂觀鎖或分布式鎖,共同保障了購物車系統(tǒng)的查詢效率和數(shù)據(jù)安全,這些機制對高并發(fā)和大數(shù)據(jù)量的場景尤為重要
    2024-10-10
  • Java中import導(dǎo)入的用法說明

    Java中import導(dǎo)入的用法說明

    這篇文章主要介紹了Java中import導(dǎo)入的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java多線程通信問題深入了解

    Java多線程通信問題深入了解

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Java編程獲取當(dāng)前屏幕分辨率的方法示例

    Java編程獲取當(dāng)前屏幕分辨率的方法示例

    這篇文章主要介紹了Java編程獲取當(dāng)前屏幕分辨率的方法,涉及java針對系統(tǒng)硬件信息的相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • JVM如何處理異常深入詳解

    JVM如何處理異常深入詳解

    異常處理的兩大元素:拋出異常、捕獲異常,非正常處理的兩個方法。下面這篇文章主要給大家介紹了關(guān)于JVM如何處理異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2019-01-01

最新評論

隆德县| 三门峡市| 皋兰县| 右玉县| 托克逊县| 青海省| 宁武县| 丹巴县| 鹰潭市| 綦江县| 丰都县| 揭阳市| 华容县| 克东县| 铜鼓县| 乐山市| 伊春市| 隆安县| 津南区| 宣城市| 泰安市| 浑源县| 龙海市| 英德市| 渭南市| 佛山市| 缙云县| 杭锦旗| 开原市| 韶关市| 古田县| 信丰县| 沅江市| 黄冈市| 双峰县| 博客| 同德县| 苍山县| 突泉县| 宽甸| 吉木萨尔县|