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

js内存泄露 垃圾回收

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

无标题

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

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

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

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

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

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

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

[年轻一代/苗圃] 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)。 通常在堆已满或旧代已满时触发。 这通常是接管执行垃圾回收的' Stop-the-World '事件或线程。 还有另一种称为完全垃圾收集(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

这与并行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

js内存泄露 垃圾回收

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

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

相关文章

qlineedit文本改变时_PyQt5 QLineEdit(单行编辑器) 学习

QLineEdit is a widget that allows to enter and edit a single line of plain text. There are undo and redo, cut and paste, and drag & drop functions available for the widget.代码&#xff1a;# codingutf-8from PyQt5.QtWidgets import QApplication, QWidget,\…

jboss7.0.2_红帽JBoss企业应用平台7.0 ALPHA发布了!

jboss7.0.2红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集&#xff0c;消息传递&#xff0c;分布式缓存和其他技术集成在一起。 现在可…

java数组和list_Java中的数组和List

一.数组Array1.数组在内存中是连续存储的&#xff0c;所以它的索引速度是非常的快&#xff0c;而且赋值与修改元素也很简单2.声明数组的时候&#xff0c;必须同时指明数组的长度&#xff0c;数组的长度过长&#xff0c;会造成内存浪费&#xff0c;数组和长度过短&#xff0c;会…

sts集成jboss_与JBoss BPM Travel Agency更新了Modern BPM数据集成

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

java规则表达式_Java基础--正则表达式的规则

注意&#xff1a;正则表达式只关注格式是否正确&#xff0c;不关注内容是否有效。一、字符集合&#xff0c; []表示一个字符。1、[abc] :指a,b,c中的任意一个字符。2、[^abc]:指除了a,b,c外的任意字符。3、[a-z]&#xff1a;表示a到z间的任意一个字符。4、[a-zA-Z0-9]:表示a到z…

获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例

获取http请求标头在使用Java EE开发和发展REST API的过程中&#xff0c;有些情况下您希望以更精细的方式&#xff08;视情况&#xff09;对传入的HTTP请求&#xff08;特别是标头参数&#xff09;进行“观察” Servlet过滤器或更具体的ContainerRequestFilters 。 我发现在某些…

java多线程区别_Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序。其实&#xff0c;创建线程与创建普通的类的对象的操作是一样的&#xff0c;而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程&#xff0c;有两种方法&#xff1a;◆需要从Java.lang.Thre…

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

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

java socket优化_Java Socket编程代码优化

1.问题&#xff1a;在学习Java的Socket编程&#xff0c;写了一些代码练习&#xff0c;但是又不知道是否规范&#xff0c;是否有优化的空间&#xff1f;2.代码&#xff1a;package com.nekolr.socket;import com.google.common.util.concurrent.ThreadFactoryBuilder;import jav…

java 函数式编程_Java函数式编程:Javaslang入门

java 函数式编程Java是一门古老的语言&#xff0c;并且该领域中有很多新手在他们自己的领域&#xff08;JVM&#xff09;上挑战Java。 但是Java 8到来并带来了一些有趣的功能。 这些有趣的功能使编写新的惊人框架&#xff08;例如Spark Web框架或Javaslang&#xff09;成为可能…

java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释&#xff1a;A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.A thread is a…

web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件

web.xml.jsf让我们直接跳到很酷的东西上&#xff0c;说在JSF 2.0中&#xff0c;通过在Facelet标记库&#xff08; *taglib.xml &#xff09;中对其进行配置&#xff0c;使页面作者可以使用自定义组件。 此外&#xff0c;当将组件映射到JAR中时&#xff0c;需要在web.xml一个特殊…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4&#xff0c;打算用来看PDF、练代码。安装了Eclipse并且打开之后&#xff0c;发现图标显示极其细小&#xff0c;肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错&#xff0c;苏菲4的屏幕分…

java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由我与一位同事讨论了Java与JavaScript的话题&#xff0c;这是一个有问题的话题。 然后他提到React Native多么出色&#xff0c;我决定我必须研究一下&#xff0c;也许要为Codename One掌握一些想法…… 那里有一些不错的主意&#xff0c;但是它们都不是革命性的或例…

java发送文件_java 模拟http发送文件和参数

一、maven&#xff1a;org.apache.httpcomponentshttpmime4.5.3二、工具类&#xff1a;import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…

设置Elasticsearch N-Gram字分析器的过程

说n-gram是一个大话题&#xff0c;这是轻描淡写的。 进行快速搜索&#xff0c;您会发现自己盯着语言学和语言模型&#xff0c;数据挖掘或特定蛋白质的分解对首次亮相文化的衰落所隐含的信息量。 好吧&#xff0c;我在跟那最后一个开玩笑。 但是&#xff0c;如果您是开发人员&a…

java字节码反编译_javap 反编译 java 字节码文件

概述&#xff1a;javap是 Java class文件分解器&#xff0c;可以反编译&#xff0c;也可以查看java编译器生成的字节码&#xff0c;从而对代码内部的执行逻辑进行分析。语法&#xff1a;把java文件编译为class文件&#xff1a;javac Test.java (Test.java为java文件名) 生成对…

javaone_JavaOne演讲者选择了您不容错过的10个会话

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

java servlet文件下载_Java之Servlet文件下载20190228

jsp页面:pageEncoding"utf-8"%>Insert title here下载index.jsp下载1.jpg下载test.jspServlet:packageorg.jimmy.testwebproject2019012602.servlet.download;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.se…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;…