Java内存体系结构(模型),垃圾回收和内存泄漏

Java内存架构(Java内存模型)

无标题

上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen。 还提供了比率,以使您更好地了解如何在每种世代类型之间分配允许的内存。 以上所有内容完全适用于Java 1.7版(含)。 上面也称为内存模型的“管理区域”。

除上述内容外,还有一个堆栈区域,可以使用-Xss选项进行配置。 该区域保存堆上的引用,本机引用,pc寄存器,代码缓存和所有线程的局部变量。 这也称为内存模型的“本地区域”。

Java内存模型的受管区域(Java内存体系结构)

[年轻一代/苗圃]伊甸园空间

所有新对象都首先在Eden Space中创建。 一旦达到由JVM确定的任意阈值,就会启动次要垃圾回收(Minor GC)。它首先删除所有非引用对象,并将引用对象从“ eden”和“ from”移到“ to”幸存者空间。 GC结束后,将交换“从”和“到”角色(名称)。

[年轻一代/苗圃]幸存者1(来自)

这是幸存者空间的一部分(您可能认为这是幸存者空间中的角色 )。 这是上一个垃圾回收(GC)期间的“ to”角色。

[年轻一代/苗圃] Suvrivor 2(至)

这也是幸存者空间的一部分(您可能认为这也是幸存者空间中的角色 )。 在这里,在GC期间,所有引用的对象
从'from'和'eden'移到。

[上一代]终身任职

根据阈值限制,可以使用-XX:+ PrintTenuringDistribution来检查阈值限制,该限制按年龄显示对象(以字节为单位的空间)–对象从“到” 幸存者空间移动到Tenured空间。 “年龄”是指它在幸存者空间内移动的次数。 还有其他重要的标志,例如-XX:InitialTenuringThreshold,-XX:MaxTenuringThreshold-XX:TargetSurvivorRatio ,它们可以优化使用权和幸存者空间。 通过设置-XX:InitialTenuringThreshold-XX:MaxTenuringThreshold,我们允许'Age'的初始值和最大值,同时保持-XX:+ NeverTenure-XX指定的'Survivor(To)'中的百分比利用率。 + AlwaysTenure,正如他们建议的那样,要么永不保管对象(使用风险较大 ),相反的用法是始终保有权,即始终使用“老一代”。 这里发生的垃圾收集是主要垃圾收集(主要GC)。 通常在堆已满或旧代已满时触发。 这通常是接管执行垃圾回收的“ 世界停止 ”事件或线程。 还有另一种称为完全垃圾收集(Full GC)的GC,它涉及其他内存区域,例如permgen空间。

与整个堆相关的其他重要且有趣的标志是-XX:SurvivorRatio-XX:NewRatio ,它们指定eden空间与幸存者空间的比率以及旧一代与新一代的比率。

[永久世代] Permgen空间

“ Permgen”用于存储以下信息:常量池(内存池),字段和方法数据以及代码。 它们每个都与名称所暗示的特征相同。

垃圾收集算法

串行GC(-XX:UseSerialGC):年轻一代和老一代的GC

为年轻和终身使用的一代使用简单的标记扫描紧凑循环。 这对于客户端系统以及内存占用量少和cpu较小的系统来说非常有用

并行GC(-XX:UseParallelGC):年轻一代和老一代的GC

这使用了N个线程,可以使用-XX:ParallelGCThreads = N进行配置,这里N也是CPU内核的数量。 用于垃圾收集。 它在Young代中将这N个线程用于GC,而在Old代中仅使用一个线程。

并行旧GC(-XX:UseParallelOldGC):年轻一代和老一代的GC

这与Parallel GC相同,不同之处在于它在旧一代和年轻一代中均使用N个线程进行GC。

并发标记和扫描GC(-XX:ConcMarkSweepGC):旧Generaton上的GC

顾名思义,CMS GC将GC所需的停顿最小化。 创建高响应性的应用程序最有用,并且仅在旧一代中才执行GC。 它为GC创建了多个线程,这些线程与应用程序线程并发工作,可以使用-XX:ParallelCMSThreads = n指定这些线程

G1 GC(-XX:UseG1GC):年轻一代和老年人一代的GC(通过将堆分成相等大小的区域)

这是一个并行,并发且递增压缩的低暂停垃圾收集器。 它是在Java 7中引入的,其最终目标是取代CMS GC。 它将堆划分为多个大小相等的区域,然后执行GC,通常从实时数据较少的区域开始-因此,即“垃圾优先”。

最常见的内存不足问题

所有Java开发人员都应该知道的最常见的内存不足问题,以便正确地开始调试,如下所示:

  • 线程“ main”中的异常:java.lang.OutOfMemoryError:Java堆空间这并不一定意味着内存泄漏,这可能是由于为堆配置的空间较小所致。 否则,在寿命长的应用程序中,可能是由于无意中提到了对堆对象的引用(内存泄漏)。 甚至应用程序调用的API都可能包含对不必要的对象的引用。 同样,在过度使用终结器的应用程序中,有时对象会排队到终结队列中。 当这样的应用程序创建更高优先级的线程并导致finalizaton队列中的对象越来越多时,它可能导致内存不足。
  • 线程“ main”中的异常:java.lang.OutOfMemoryError:PermGen空间如果加载了许多类和方法,或者创建了很多字符串文字,尤其是通过使用intern()(从JDK 7开始,不再使用实习字符串) (PermGen的一部分)–则发生这种类型的错误。 发生此类错误时,文本ClassLoader.defineClass可能会出现在所打印的堆栈跟踪顶部附近。
  • 线程“ main”中的异常:java.lang.OutOfMemoryError:请求的数组大小超出VM限制当请求的数组大小大于可用堆大小时,再次发生这种情况。 如果为数组大小请求一个非常大的值,通常可能由于运行时的程序错误而发生。
  • 线程“ main”中的异常:java.lang.OutOfMemoryError:请求<r>的<s>个字节。 交换空间不足?
    通常这可能是内存泄漏的根本原因。 当操作系统没有足够的交换空间另一个进程占用系统上所有可用的内存资源时,就会发生这种情况。 简而言之,由于空间耗尽,它无法从堆中提供请求空间。 该消息指示失败的请求的大小“ s”(以字节为单位)以及内存请求的原因“ r”。 在大多数情况下,消息的<r>部分是报告分配失败的源模块的名称,尽管在某些情况下它表示原因。
  • 线程“ main”中的异常:java.lang.OutOfMemoryError:<原因> <堆栈跟踪>(本机方法)
    这表明本机方法遇到分配失败。 根本原因是该错误发生在JNI中,而不是在JVM内部执行的代码中发生。 当本机代码不检查内存分配错误时,应用程序将崩溃而不是耗尽内存。

内存泄漏的定义

“将内存泄漏视为一种疾病,而将OutOfMemoryError视为一种症状。 但是,并非所有OutOfMemoryErrors都暗示内存泄漏,并且并非所有内存泄漏都将自身表现为OutOfMemoryErrors。 ”

在《计算机科学》中,内存泄漏是一种资源泄漏,当计算机程序错误地管理内存分配以致不再释放不再需要的内存时,就会发生这种情况。 在面向对象的编程中 ,当对象存储在内存中但无法被运行的代码访问时,可能会发生内存泄漏。

Java中内存泄漏的常见定义:

当不必要的对象引用被不必要地维护时,就会发生内存泄漏。

在Java中,内存泄漏是指某些对象不再被应用程序使用,但是GC无法将其识别为未使用的情况。

当程序中不再使用某个对象,但仍在无法访问的某个位置引用该对象时,将出现内存泄漏。 因此,垃圾收集器无法删除它。 用于此对象的内存空间不会释放,并且用于程序的总内存将增加。 随着时间的推移,这将降低性能,并且JVM可能会耗尽内存。

从某种意义上说,当在永久性空间上无法分配任何内存时,就会发生内存泄漏。

内存泄漏的一些最常见原因是:

  1. 线程局部变量
  2. 圆形和复杂双向参考
  3. JNI内存泄漏
  4. 可变的静态字段(最常见)

我建议使用与JDK捆绑在一起Visual VM,以开始调试内存泄漏问题。

内存泄漏的常见调试

  1. NetBeans探查器
  2. 使用jhat实用程序
  3. 创建堆转储
  4. 在运行过程中获取堆直方图
  5. 在OutOfMemoryError处获取堆直方图
  6. 监视即将完成的对象数量
  7. 第三方内存调试器

调试内存泄漏问题的常用策略或步骤包括:

  • 识别症状
  • 启用详细垃圾回收
  • 启用分析
  • 分析痕迹

祝幸福时光,解决Java内存问题!

翻译自: https://www.javacodegeeks.com/2015/11/java-memory-architecture-model-garbage-collection-and-memory-leaks.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1101. 献给阿尔吉侬的花束(bfs找最短路径)

题目&#xff1a; 1101. 献给阿尔吉侬的花束 - AcWing题库 输入样例&#xff1a; 3 3 4 .S.. ###. ..E. 3 4 .S.. .E.. .... 3 4 .S.. #### ..E.输出样例&#xff1a; 5 1 oop! 思路&#xff1a;bfs宽搜 用队列实现bfs。踢出队列头&#xff0c;并在队列尾插入与对头相关的…

c 编程语言概述,C编程语言概述

C编程语言概述引导语&#xff1a;C的应用范围广泛&#xff0c;具备很强的数据处理能力&#xff0c;以下是百分网小编分享给大家的C编程语言概述&#xff0c;欢迎阅读学习!编程语言概述学习一门新语言的惟一途径就是使用它来编程。对于初学者来说&#xff0c; 编写的第一个程序几…

Linux crontab定时执行任务

基本格式 : *  *  *  *  *  command 分 时 日 月 周 命令 第1列表示分钟1&#xff5e;59 每分钟用*或者 */1表示 第2列表示小时1&#xff5e;23&#xff08;0表示0点&#xff09; 第3列表示日期1&#xff5e;31 第4列表示月份1&#xff5e;12 第5列标识号星期0&…

apache mahout_Apache Mahout:入门

apache mahout最近&#xff0c;我有一个有趣的问题要解决&#xff1a;如何使用自动化对不同来源的文本进行分类&#xff1f; 前一段时间&#xff0c;我读到一个有关该项目以及许多其他文本分析工作的项目– Apache Mahout 。 尽管它不是一个非常成熟的版本&#xff08;当前版本…

硬链接和软连接(符号链接)

硬链接:不同路径的文件指定的是同一个inode硬链接不能跨分区存在硬链接不能链接到目录(要避免循环引用)删除硬链接只会减少文件被硬链接的次数,源文件不会动.软链接:是一个独立的文件,有自己独立的inode&#xff0c;引用的是路径本身,不是inode删除软链接,跟源文件没任何关系软…

基于nbu oj c语言答案,Just oj 2018 C语言程序设计竞赛(高级组)F:Star(结构体排序+最小生成树)...

Time Limit: 1 s Memory Limit: 128 MBProblem Description31世纪&#xff0c;人类世界的科技已经发展到了空前的高度&#xff0c;星际移民&#xff0c;星际旅游早已经不再是问题。人类已经掌握了开发星系的能力。但是&#xff0c;无论发展到何种地步&#xff0c;资源一直…

与JBoss BPM Travel Agency更新了现代BPM数据集成

不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍了在实际使用…

c语言中坐标xoy轴在哪里,用C语言在linux下获取鼠标指针的相对位置

1. 关于"/dev/input/mice"相信很多人都用过Linux&#xff0c;也许你发现不管是在X-window下面&#xff0c;还是在Console下面&#xff0c;鼠标都是可以操作的。那么你有没有考虑过这些鼠标都是从哪来的&#xff1f;不错&#xff01;他们都是从"/dev/input/mice&…

codeblock不能调试

问题&#xff1a;codeblock 不能调试&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 首先&#xff0c;项目的保存路径不能是中文路径。 其次&#xff0c;必须创建工程。 最后&#xff0c;build选项里select target选成debug codeblock如何创建工程&#xff1a;http://j…

与詹金斯一起将GitLab中的Gradle项目发布到Artifactory

我将详细展示如何定期构建您的项目&#xff0c;然后如何进行发布。 它涉及许多工具的协作&#xff0c;我发现这些工具难以正确设置&#xff0c;这就是我编写此代码的原因。 目标 我将向您展示如何实现以下两种方案。 第一个是如何进行常规开发的非发行版&#xff1a; 实现一些…

比较排序算法的时间复杂度 c语言,c语言四种排序算法时间复杂度比较(10页)-原创力文档...

1、方案设计&#xff1a;我这次实验通过随机生成300&#xff10;0个随机数&#xff0c;把随机数存到数组中,用这同一组随机数据分别进行四种排序&#xff0c;直接插入排序、直接选择排序、冒泡排序和快速排序。还通过了调用txt文件把运算所需时间导出&#xff0c;分别输出各个算…

三维漫游的实现

一、本文主要是展示一个demo&#xff0c;实现的是画一个三维的立方体&#xff0c;通过滑动屏幕来旋转方向&#xff0c;上下左右来移动。直接上代码&#xff1a; MainActivity&#xff1a;package com.example.zp.a3dword;import android.graphics.Bitmap;import android.graphi…

MySQL JDBC驱动程序如何处理准备好的语句

准备的语句类型 在研究《 高性能Java持久性》一书中的“ 语句缓存”一章时&#xff0c;我有机会比较了Oracle&#xff0c;SQL Server&#xff0c;PostgreSQL和MySQL处理预准备语句的方式。 感谢Jess Balint &#xff08;MySQL JDBC驱动程序贡献者&#xff09;&#xff0c;他在…

Nodejs学习(三)-安装nodejs supervisor,提高点效率吧。

安装好了express准备写项目&#xff0c;可是发现随便改一下js都要使用npm start重新启动才能生效&#xff0c;这个很不好&#xff0c;搜索一下发现有这么一个模块supervisor。那就安装一下吧。 1.安装&#xff0c;这个必须是全局安装那就开始吧。 npm -g install supervisor 设…

网络语言不c,哪些网络用语不文明?

满意答案林昨末sk2013.02.26采纳率&#xff1a;47% 等级&#xff1a;11已帮助&#xff1a;8049人Q1. 你认为在网络上出现的不文明用语情况_B___&#xff1f;A.是人们宣泄情绪的一种重要方式 B.是当今社会的一个缩影&#xff0c;没有办法C.不应当提倡&#xff0c;应加大管理力…

android 无限旋转动画,android ——不停旋转动画

xml文件android:fromDegrees"359"android:toDegrees"0"android:duration"1000"android:repeatCount"-1"android:pivotX"50%"android:pivotY"50%"/>代码/开始旋转/public voidstartRotateAnimation(View view, …

九章算法强化班 - 课程大纲

第1章 FLAG算法面试难度提高&#xff1f;如何准备&#xff1f; 各类IT企业的面试算法难度及风格 如何解决中等难度以上的算法题 如果解决follow up问题 Two sum   1. Two sum follow up I   2. Two sum follow up II - Triangle count Kth largest element   1. 第…

JavaOne演讲者选择了您不应该错过的10个会话

确保您的会议安排中包含这些JavaOne会话 JavaOne 2015从这个星期日开始&#xff0c;数百个会话同时进行&#xff0c;因此很难筛选所有会话并选择要参加的会话。 这就是为什么我们邀请5位我们最喜欢的JavaOne发言人让我们了解他们的会议&#xff0c;并选择他们最期待的会议。 好…

谷歌发布最新版安卓Android,谷歌正式除名华为,安卓12华为首发无望,但鸿蒙将迎难顶上!...

原标题&#xff1a;谷歌正式"除名"华为&#xff0c;安卓12华为首发无望&#xff0c;但鸿蒙将迎难顶上&#xff01;前几天谷歌正式发布了新一代的安卓12系统。这也是安卓的第十二个大更新版本&#xff0c;从安卓1.0发布的2008年算起&#xff0c;安卓系统已经走过13个年…

android sd卡 格式化 rom,Android开发之获取SD卡及手机ROM容量的方法

本文实例讲述了Android获取SD卡及手机ROM容量的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这里通过一个简单的小例子&#xff0c;来获取SD卡的容量和手机ROM的容量&#xff0c;代码如下&#xff1a;package com.urovo.sdcardspace;import java.io.File;impor…