`
jiangduxi
  • 浏览: 443825 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
java SE应用程序共同的问题
在java SE应用程序中的问题与资源有关的有:内存、线程、类和锁。资源冲突或泄漏可能导致性能问题或意想不到的错误。
问题症状诊断工具
内存不足 OutOfMemoryErrorjava堆分析工具(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块,直到第一个线程完成它的更新并释放对象监视器。同步争用情况会影响应用程序的性能和可扩展性。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics