java SE应用程序共同的问题
在java SE应用程序中的问题与资源有关的有:内存、线程、类和锁。资源冲突或泄漏可能导致性能问题或意想不到的错误。
问题 | 症状 | 诊断工具 |
内存不足 | OutOfMemoryError | java堆分析工具(jhat) |
内存泄漏 | 1.内存的使用增长,频繁的进行GC操作 2.类的增长率很高,类的实例数异常 3.对象被意外引用 | 1.java监视和管理控制台(jconsole)、JVM统计监视工具(jstat)2.内存图(jmap) |
Finalizer | 对象挂起,无法完成 | jconsole,jmap |
死锁 | 对象监视器或java.util.concurrent锁上的线程阻拦 | jconsole ,jmap |
循环线程 | 线程CPU时间连续地增加 | jconsole ,JTop |
严重的锁争取 | 线程的争用统计值很高 | jconsole |
内存不足
Java虚拟机(JVM)*有以下类型的内存:堆内存、非堆内存和本机内存。
引用
堆内存是为所有类实例和数组分配内存的运行时数据区域。
非堆内存包括对JVM进行内部处理或优化所需的方法区域和内存。它存放每个类的结构,例如一个运行时常数池、字段和方法数据,以及方法和构造函数代码。
本机内存是操作系统处理的虚拟内存。当内存不足,无法分配给应用程序时,
即抛出 java.lang.OutOfMemoryError。
以下错误信息即为每种类型的内存可能抛出的 OutOfMemoryErrors 错误消息:
堆内存错误。
当应用程序创建一个新的对象,但是堆没有充足的空间,并且不可能进一步被扩展时,将抛出 OutOfMemoryError 与以下错误信息:
引用
java.lang.OutOfMemoryError: Java heap space
非堆内存错误。 永久保存区是HotSpot VM 实现中的一个非堆内存区,用于存放每个类结构和驻留的字符串。当这个永久保存区充满时,这个应用程序将不能装载类或分配驻留的字符串,并且会抛出OutOfMemoryError与以下错误信息:
引用
java.lang.OutOfMemoryError: PermGen space
本机内存错误。
Java本机接口 (JNI)代码或应用程序的本机库以及JVM实施从本机堆分配内存。当分派在本机堆发生故障时,抛出 OutOfMemoryError。例如,以下错误信息表明交换空间不足,这可能由于操作系统的配置问题所致,或由于系统中的另一个进程消耗过多内存:
引用
java.lang.OutOfMemoryError: request <size> bytes for <reason>.
Out of swap space?
内存泄漏
JVM负责自动管理内存,为应有程序索还尚未使用的内存。然而,如果应用程序持续引用它不再需要的对象,这个对象便不能被垃圾回收,它将继续占用空间,直到被删除为止。这种无意识的对象保留称为内存泄漏。如果应用程序泄漏很多内存,它最终将用尽内存,并且抛出OutOfMemoryError。另外,垃圾回收也会常常发生,因为应用程序尝试释放空间,因而造成应用程序运行减慢。
Finalizer
OutOfMemoryError的另一个可能原因是对finalizer的过分使用。java.lang.Object类有一个被保护的方法叫finalize。类可以忽略此finalize方法,以在该类的对象被垃圾回收之前处理系统资源或执行清理。可以被对象调用的finalize方法称为该对象的finalizer。不保证finalizer何时运行,也不保证它可以运行。有finalizer的对象在其 finalizer 运行之前都不会被垃圾回收。因此,为最终完成而挂起的对象将保留内存,即使对象不再被该应用程序引用也是如此,这还可能导致与内存泄漏相似的问题。
死锁
当两个或多个线程都等待另一个线程释放锁时,就会发生死锁。Java编程语言使用监视器来同步线程。每个对象都同一个监视器联系在一起,也被称为对象监视器。如果线程在对象上调用一个synchronized方法,则该对象被锁定。另一个线程若在此相同对象上调用synchronized方法,则会被阻拦,直至锁被释放为止。除内置的同步支持以外,在J2SE 5.0中引入的java.util.concurrent.locks包为锁定和等待条件提供了一个框架。死锁可能涉及对象监视器和java.util.concurrent锁。
一般情况下,死锁会导致这种应用程序或它的一部分变得无响应。例如,如果负责图形用户界面 (GUI)更新的进程被锁死, GUI应用程序则会冻结,并且不响应任何用户动作。
循环线程
循环线程也可能造成应用程序挂起。当一个或多个线程在一个死循环中执行时,这个循环也许会消耗所有可利用的CPU周期并造成这种应用程序的其余部分无响应。
严重的锁争用
同步在多线程应用程序中大量使用,这是为了保证对一种共享资源的独占访问或为了在多个线程间协调和完成任务。例如,应用程序在数据结构上使用一台对象监视器同步更新。当两个线程试图同时更新数据结构时,只有一个线程能获取对象监视器和继续更新数据结构。同时,另一个线程被阻拦, 等待进入synchronized块,直到第一个线程完成它的更新并释放对象监视器。同步争用情况会影响应用程序的性能和可扩展性。
分享到:
相关推荐
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...
在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...
OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
Qt作为一个流行的C++图形用户界面库,提供了丰富的功能,但同时也需要开发者正确地管理内存以避免可能导致程序崩溃或数据损坏的内存溢出问题。本文将深入探讨Qt内存溢出检测,以及如何借助Visual Leak Detector (VLD...
虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言...
在编程领域,内存管理是至关重要的,特别是在处理大文件时,如何有效防止内存溢出是开发者需要关注的核心问题。易语言是一种以中文编程为特色的编程环境,它为初学者提供了友好的界面和易于理解的语法。在这个场景下...
标题中的"解决jetty8内存溢出版本"意味着我们面对的是一个针对Jetty 8的特殊构建或配置,其目标是优化内存使用,防止或减少内存溢出的发生。在32位和64位操作系统上都能安装为服务,这意味着这个版本考虑到了兼容性...
然而,在这个过程中,开发者经常面临内存溢出错误的问题。这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现...
### 如何避免JDBC引起的内存溢出情况 在日常的软件开发过程中,特别是在处理大量数据时,使用Java数据库连接(JDBC)进行数据库操作是非常常见的。然而,在处理大数据集时,如果不注意细节,很容易遇到内存溢出的...
内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...
在编程领域,内存管理是至关重要的一个环节,尤其是在处理大文件时,防止内存溢出显得尤为重要。易语言作为一款国产的、面向对象的编程语言,虽然语法简洁,但同样需要处理好内存分配与释放的问题。本篇文章将深入...
### Maven内存溢出解决方案 #### 一、引言 在使用Maven进行项目构建时,尤其是在处理大型项目或执行资源密集型任务(如`mvn site`)时,经常会遇到Java堆空间溢出的问题。这类问题通常是由于Maven运行所需的内存...
绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...
在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...
### Eclipse Memory Analyzer (MAT) 分析 Tomcat 内存溢出详解 #### 一、引言 在软件开发过程中,特别是在 Java 应用程序中,内存管理是非常关键的一环。当应用程序遭遇 `OutOfMemoryError` 异常时,通常意味着...
本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!