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块,直到第一个线程完成它的更新并释放对象监视器。同步争用情况会影响应用程序的性能和可扩展性。
分享到:
相关推荐
内存溢出配置,内存溢出配置内存溢出配置内存溢出配置
OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...
软件开发 数据库 内存泄露 内存溢出
绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...
程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了, 内存溢出的问题要看业务和系统大小而定,对于某些系统可能内存溢出不常见,但某些系统还是很常见的解决的方法
根据这个设计方案,做了详细的实现,经项目验证,Excel文件20W条数据不成问题,因为Excel解析是我自己原创的行级处理器,不会一次性生成很多对象,因此不存在内存溢出现象,只要excel文件放得下,有多少记录都没问题...
本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!
JAVA内存溢出问题总结
内存溢出问题是参加kaggle比赛或者做大数据量实验的第一个拦路虎。 以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练。 其实这是有问题的,很容易导致OOM。...
解决内存溢出的问题,在使用myeclipse时候,经常遇到内存溢出的问题。
在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。本文就介绍了Tomcat内存溢出的三种情况及解决办法分析
一个Qt内存溢出检测小工具,(需要VLD支持)。
完美解决java读取excel内存溢出问题,希望可以帮到大家
Websphere Application Server WAS 内存溢出分析,帮助分析内存问题
处理bitmap内存溢出问题
WebBrowser 控件 内存溢出 补丁 From Microsoft 在程序中用WebBrowser长时间不停访问不同页面会造成内存溢出,微软给出了补丁,但是似乎没有怎么测试。要获得补丁必须通过邮件申请,我申请了三次才凑够了XP,2003和...
有的时候,我们需要一次查询很多的数据,或者是说每次查询的数据量都很大,都有可能早晨内存溢出的情况,所以我们今天分别针对三个数据库来探讨如何避免这一问题。
jboss内存溢出 jboss内存溢出 jboss内存溢出
分虽然多了点,但是项目...图片过大内存溢出:在图片读取是处理里图片,解决了溢出问题 项目下载后,直接导入就可以运行,是2.2的版本,有个插件android-async-http-1.4.4.jar,可能要配置下,还有服务器,端口是8080