Java和內存泄漏

總覽

術語“內存泄漏”在Java中的使用方式不同于在其他語言中使用的方式。 通用術語中的“內存泄漏”是什么意思,在Java中如何使用?

維基百科的定義

當計算機程序消耗內存但無法將其釋放回操作系統時,就會發生計算機科學中的內存泄漏(在此情況下為泄漏)。

JVM在啟動時將堆保留為虛擬內存,并且直到退出后才將其歸還。 該虛擬內存在使用時會變成主內存。 這就是為什么JVM的虛擬大小和駐留大小可能非常不同,并且駐留內存可以在不更改虛擬內存的情況下增長的原因。

在面向對象的編程中,當對象存儲在內存中但無法被運行的代碼訪問時,就會發生內存泄漏。

GC總是可以找到堆上的每個對象,甚至是應用程序無法訪問的對象。 這樣,就沒有運行代碼無法達到的對象。

但是,許多人將內存使用中的任何不必要的增加都稱為內存泄漏,盡管從技術角度來看這并不是嚴格準確的。

在Java中,沒有完整的GC就無法確定所需的內存量。 看到Java應用程序鋸齒狀的“已用”內存是正常的。 在每個GC之后返回相同的內存量表示所需的內存沒有增加。

內存泄漏會通過減少可用內存量來降低計算機的性能。 最終,在最壞的情況下,可能會分配過多的可用內存,并且系統或設備的全部或部分停止正常工作,應用程序出現故障,或者系統由于崩潰而無法正常運行。

這就是該術語在Java中的用法。 結論是可用內存減少了,這是內存泄漏。

但這真的是內存泄漏嗎?

Java中的“內存泄漏”示例

最近,在StackOverflow上提出了兩個問題,這些問題說明了Java中“內存泄漏”的含義的各種觀點。

Go是否會像Java一樣受到微妙的內存泄漏?
在Java中創建內存泄漏

在第一篇文章中,有一種觀點表示“內存泄漏”是指應用程序持有對不再需要的對象的引用。 另一種觀點認為,JVM本身沒有內存泄漏。

在第二篇文章中,有許多示例說明了如何使用JVM來隱藏內存使用情況或消耗內存的操作。 示例包括File.deleteOnExit(),創建大的靜態字段,廢棄的套接字,文件句柄,線程,不需要的JDBC連接。

退出時File.deleteOnExit必須使用一些內存才能執行其任務。 這不是我的選擇的泄漏,因為它沒有保留不需要的內存。

具有不需要的靜態字段和線程會浪費內存,這是JVM無法糾正的錯誤。

但是,創建JVM處理的套接字,文件句柄和JDBC連接。 調用finalize()方法時,將清除這些資源。

結論

在Java中,將保留且不再需要的對象稱為“內存泄漏”是有意義的。

Java語言中沒有什么容易出現此問題的,并且JRE庫可以保護自己免受應用程序代碼中的錯誤的侵害。

您的應用程序仍然可能存在內存泄漏,您需要對何時仍需要資源(特別是線程)做出明智的選擇,如果您堅持太長時間,則可能意味著您存在“內存泄漏”。

參考: Vanilla Java博客上來自我們的JCG合作伙伴 Java和內存泄漏 。

相關文章 :
  • Java中的低GC:使用原語而不是包裝器
  • Erlang與Java內存架構
  • JVM如何處理鎖
  • JVM選項:-client vs -server

翻譯自: https://www.javacodegeeks.com/2011/07/java-and-memory-leaks.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374531.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

453. 最小操作次數使數組元素相等

給你一個長度為 n 的整數數組&#xff0c;每次操作將會使 n - 1 個元素增加 1 。返回讓數組所有元素相等的最小操作次數。 class Solution {public int minMoves(int[] nums) {int res 0;int sum 0;int n nums.length;for(int i 0;i<n;i){sum nums[i];}res sum - min…

第二章 TCP/IP 基礎知識

第二章 TCP/IP 基礎知識 TCP/IP transmission control protocol and ip internet protocol 是互聯網眾多通信協議中最為著名的。 2.2 TCP/IP 的標準化 2.2.2 TCP/IP 標準化精髓 TCP/IP 協議始終具有很強的實用性。 相比于TCP/IP &#xff0c;OSI 之所以未能達到普及&#xff0…

CSS太陽月亮地球三角戀旋轉效果

純粹玩一下&#xff0c;好像沒有什么實際的卵用&#xff0c;but&#xff0c;純玩買不了上當&#xff0c;純玩買不了受騙。。。。。。。。 地月旋轉的一個css效果&#xff0c;無聊玩玩&#xff0c;可以復制到記事本試試 <!DOCTYPE html><html lang"en">&l…

gorm preload 搜索_LeetCode刷題筆記|95:不同的二叉搜索樹 II

題目描述給定一個整數 n&#xff0c;生成所有由 1 ... n 為節點所組成的 二叉搜索樹 。示例輸入&#xff1a;3輸出&#xff1a;[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解釋&#xff1a;以上的輸出對應以下 5 種不同結構的二叉搜索樹&#xf…

Java初學者指南

Java編程的第一步。 對于Java中的入門教程&#xff0c;請參閱Sun的官方幫助這里 除了核心語言外&#xff0c;還有幾種技術和API 介紹。 我們建議首先閱讀涵蓋 基礎知識&#xff0c;并繼續其余的教程。 我們建議&#xff1a; 保持代碼簡單易讀 拆分邏輯組件&#xff08;類…

Javascript中Promise對象的實現

http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/轉載于:https://www.cnblogs.com/zuiyirenjian/p/4787864.html

字符串分割與存入List集合

List<string> namelist new List<string>(); string[] namejh null; string name "張三李四王五"; 第一步&#xff1a;將三個名字分離出來 namejh name.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); namelist new Li…

GTJ2018如何導出全部工程量_如何成為優秀的造價員?廣聯達編制內刊手冊,造價員算量高手秘籍...

如何成為優秀的造價員&#xff1f;廣聯達編制內刊手冊&#xff0c;造價員算量高手秘籍[高手秘籍]是廣聯達課程編制委員會暨直播委員會精心打造的&#xff0c;能夠“讓您深入理解軟件計算、設置等原理,遇到問題有處理思路,以常見問題為導向&#xff0c;重點進行原因分析&#xf…

帶有Spring,Hibernate,Akka,Twitter Bootstrap,Apache Tiles和jQuery的Maven Web項目Kickstarter代碼庫...

我很高興將第二個項目上傳到GitHub&#xff0c;以幫助人們盡快開始Java Web App開發。 我正在與Apache License 2.0共享此代碼。 這是相同的網址&#xff1a; https://github.com/ykameshrao/spring-hibernate-springdata-springmvc-maven-project-framework 該項目包括以下部…

git項目添加.gitigore文件

以前一直沒有注意這個文件&#xff0c;最近讀到了黃勇的《架構探險》&#xff0c;覺得這個文件還是很有用的。 .gitigore文件可以自己配置。 我使用的是書中所用的配置&#xff0c;簡潔明了。 # Maven # target/#log# logs/# IDEA # .idea/ *.iml# Eclipse # .settings/ .metad…

463. 島嶼的周長

給定一個 row x col 的二維網格地圖 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陸地&#xff0c; grid[i][j] 0 表示水域。 網格中的格子 水平和垂直 方向相連&#xff08;對角線方向不相連&#xff09;。整個網格被水完全包圍&#xff0c;但其中恰好有一個島嶼&a…

C++服務器設計(七):聊天系統服務端實現

在之前的章節中&#xff0c;我們對服務端系統的設計實現原理進行了剖析&#xff0c;在這一章中&#xff0c;我們將對服務端框架進行實際運用&#xff0c;實現一款運行于內網環境的聊天系統。該聊天系統由客戶端與服務器兩部分組成&#xff0c;同時服務端通過數據庫維護用戶的賬…

高校實驗室管理系統_史上最全面的實驗室信息管理系統(LIMS)全解

1. LIMS的基本概念和發展狀況1.1 概括LIMS實驗室管理系統是為實驗、檢測等業務板塊提供流程化、模塊化、標準化操作管理系統&#xff0c;打造基于行業法規的實驗室全流程質量控制管理系統&#xff0c;實現實驗室“人、機、料、法、環”關鍵環節管理。1.2 發展狀況隨著科研規范化…

ORM問題

在過去的幾年中&#xff0c;像Hibernate這樣的對象關系映射工具已經幫助開發人員在處理關系數據庫方面取得了巨大的生產力增長。 ORM使開發人員可以將精力集中在應用程序邏輯上&#xff0c;并避免為諸如插入或查詢之類的簡單任務編寫大量樣板SQL。 但是&#xff0c;充分證明的對…

ActiveMQ中Session設置的相關理解

名詞解釋&#xff1a; P&#xff1a;生產者 C&#xff1a;消費者 服務端&#xff1a;P 或者 ActiveMQ服務 客戶端&#xff1a;ActiveMQ服務 或者 C 客戶端成功接收一條消息的標志是這條消息被簽收。成功接收一條消息一般包括如下三個階段&#xff1a; 1&#xff0e;客戶端接收…

python中的 descriptor

學好和用好python&#xff0c; descriptor是必須跨越過去的一個點&#xff0c;現在雖然Python書籍花樣百出&#xff0c;但是似乎都是在介紹一些Python庫而已&#xff0c;對Python語言本身的關注很少&#xff0c;或者即使關注了&#xff0c;但是能夠介紹把 dscriptor介紹清楚的&…

Heroku運行Java

如果您是像我這樣的Java迷&#xff0c;那么您有個好消息值得振奮。 Heroku現在運行Java&#xff01; 嗯&#xff0c;與其他流行的“ Web”語言&#xff08;如PHP / RoR&#xff09;不同&#xff0c;Java具有在Web服務器中進行部署和維護的麻煩。 一直以來&#xff0c;只有企業才…

配置了坐標還是找不到serv_為什么老人家總是這疼那疼,還找不到原因?是矯情還是另有原因...

“哎呀&#xff0c;怎么回事&#xff0c;腰痛腿痛的&#xff0c;痛的我一晚上都沒怎么睡覺&#xff0c;怎么回事昨天也沒干嘛啊&#xff01;”對于這一句話&#xff0c;相信很多朋友都不是很陌生。這句話是來自于一位網友的留言&#xff0c;而說這話的真是她的媽媽。這也是很多…

Nginx負載均衡和LVS負載均衡的比較分析

lvs和nginx都可以用作多機負載的方案&#xff0c;它們各有優缺&#xff0c;在生產環境中需要好好分析實際情況并加以利用。 首先提醒&#xff0c;做技術切不可人云亦云&#xff0c;我云即你云&#xff1b;同時也不可太趨向保守&#xff0c;過于相信舊有方式而等別人來幫你做墊被…

QuartZ.net 常用配置說明

配置文件說明app.config中的quartz部分<quartz><!-- configure Thread Pool--><addkey"quartz.threadPool.type"value"Quartz.Simpl.SimpleThreadPool,Quartz" /><addkey"quartz.threadPool.threadCount"value"10&quo…