大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java內(nèi)存溢出的原因

Java內(nèi)存溢出的原因

更新時(shí)間:2022-04-21 10:59:24 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1174次

JVM創(chuàng)建者在設(shè)計(jì)它時(shí)考慮了自動(dòng)內(nèi)存管理,這意味著程序員不需要擔(dān)心內(nèi)存分配和內(nèi)存。未使用的對(duì)象可以以透明的方式自動(dòng)釋放,這非常方便,尤其是當(dāng)您剛接觸JVM時(shí)。但是,即使是一般情況下,要編寫的代碼也比傳統(tǒng)方法少,而且不容易出錯(cuò),因?yàn)閭鹘y(tǒng)方法要求您手動(dòng)執(zhí)行所有操作。

然而,實(shí)際情況并不像聽(tīng)起來(lái)那么理想,尤其是當(dāng)你在開(kāi)發(fā)具有巨大流量的長(zhǎng)壽命應(yīng)用程序時(shí)。雖然在JVM中引起內(nèi)存泄漏比在C中更難,但仍然有可能。選擇GC算法并將其參數(shù)化對(duì)性能也有很大的影響。而且,與任何抽象或自動(dòng)化一樣,如果您希望有意識(shí)地編寫代碼(這是專業(yè)的方法),您需要了解在幕后進(jìn)行了哪些工作,以便能夠預(yù)防或診斷問(wèn)題。讓我們來(lái)看看一些有用的工具和技術(shù),這些工具和技術(shù)將幫助您找到應(yīng)用程序崩潰或減速的原因,而不是快速工作并能夠完成創(chuàng)建它的目的。

OutOfMemoryError

我們需要的第一件事是一段導(dǎo)致OutOfMemoryError的可靠代碼。OutOfMemoryError是JVM引發(fā)的異常,它通知我們內(nèi)存不足。可能有許多可能的原因?qū)е聮伋龃水惓#梢圆榭串惓5脑蛞粤私獍l(fā)生了什么。現(xiàn)在,讓我們編寫一個(gè)應(yīng)用程序,它會(huì)不斷地分配內(nèi)存,直到超過(guò)內(nèi)存限制為止;

// file Application.scala
object Application {
  def main(args: Array[String]): Unit = {
    LazyList.from(0).toList
  }
}

編譯一下:

scalac Application.scala

設(shè)置堆大小:

scala Application -J-Xmx10m -J-Xms10m

Xms和Xmx是JVM標(biāo)志,指定應(yīng)用程序的堆大小(或者簡(jiǎn)單地說(shuō),應(yīng)用程序?qū)碛卸嗌賰?nèi)存),其中Xms代表堆的初始大小,Xmx代表最大大小。

在我們的例子中,10MB是一個(gè)足夠小的值,可以很快體驗(yàn)到內(nèi)存不足。我們可以看到應(yīng)用程序崩潰,錯(cuò)誤如下:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

內(nèi)存泄露的原因

在這種情況下,問(wèn)題很明顯。我們只有一個(gè)Java線程和一行代碼。當(dāng)然,實(shí)際應(yīng)用程序要比這復(fù)雜得多。當(dāng)我們?cè)谏a(chǎn)中看到OutOfMemoryError時(shí),查看堆棧跟蹤對(duì)我們沒(méi)有幫助,因?yàn)閷?dǎo)致問(wèn)題的行是相當(dāng)隨機(jī)的,我們正在尋找一個(gè)分配內(nèi)存且不釋放內(nèi)存的代碼。我們可以在JVM內(nèi)部查找問(wèn)題的根源。

讓我們添加一個(gè)-XX:+HeapDumpOnOutOfMemoryError標(biāo)志,它將導(dǎo)致在OutOfMemoryError時(shí)生成堆轉(zhuǎn)儲(chǔ)。

scala Application -J-Xmx10m -J-Xms10m -J-XX:+HeapDumpOnOutOfMemoryError

我們可以看到,當(dāng)我們的應(yīng)用程序崩潰時(shí),生成了一個(gè)擴(kuò)展名為.hprof和PID的文件。這個(gè)文件是二進(jìn)制的,所以我們需要一些工具來(lái)查看里面的內(nèi)容。有很多工具可以完成這項(xiàng)工作,即使是在線的——比如HeapHero(http://heaphero.io/),如果數(shù)據(jù)不敏感,則可以使用。

導(dǎo)入文件后,您可以檢查的最有用的內(nèi)容是所有已分配對(duì)象的列表及其使用的內(nèi)存百分比。我們可以從scala.collection.immutable不可變以及幾乎構(gòu)成整個(gè)堆的整數(shù)。這與我們?cè)陧?xiàng)目中所做的是一致的。列表和整數(shù)是顯而易見(jiàn)的,因?yàn)槲覀儎?chuàng)建List[int]作為結(jié)果。缺點(diǎn). 這是因?yàn)镾cala的LazyList使用了memorization,所以它保留了對(duì)所有元素的引用。

在磁盤空間明顯受限的環(huán)境中(例如在云中),使用-XX:+HeapDumpOnOutOfMemoryError選項(xiàng)時(shí)要小心。這是一個(gè)完整的堆轉(zhuǎn)儲(chǔ),這意味著在OutOfMemoryError的情況下,它至少與最大堆大小一樣大。對(duì)于大的堆,這可能比分配給映像的磁盤空間大得多(因?yàn)槟赡懿恍枰嗫臻g,因?yàn)樽詈貌灰獜姆?wù)直接寫入磁盤)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 一区二区三区四区国产精品 | 天天舔| 久久成人国产精品青青 | 国产乱码亚洲精品一区二区 | 亚洲一区二区三区四区 | 中文字幕一区二区三区四区五区人 | 神马毛片 | 草草操 | 日本欧美久久久久免费播放网 | 国产精品久久久久999 | 久久天堂夜夜一本婷婷麻豆 | 久久精品国产精品亚洲人人 | 日本亚洲精品一区二区三区 | 精产国品一二二区视 | 天天摸夜夜添狠狠添2018 | 中文字幕91 | 亚洲精品成人一区二区www | 老司机免费精品视频 | 免费午夜在线视频 | 国产性色视频在线高清 | 久久免费成人 | 在线视频欧美日韩 | 成人性生活视频 | 伊人久久色 | 日本国产一区二区三区 | 天天操天天干天天做 | 欧美孕妇乱大交xxxxx | 久久精品店 | 国产精品国产精品 | 久久精品入口麻豆 | 深夜福利免费 | 国产a久久精品一区二区三区 | 天天综合日日噜噜噜 | 国产精品久久久久久亚洲伦理 | 欧美videos粗暴高清性 | 亚洲狠狠婷婷综合久久久久 | 天天想天天干 | 99热这里有免费国内精品 | 久久伊人色综合 | 色综合社区| 福利视频欧美一区二区三区 |