`

Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

 
阅读更多

1. Java垃圾回收机制(GC)

1.1 GC机制作用 

---JVM自动检测和释放不再使用的对象内存。

 

1.2 堆内存3代分布(年轻代、老年代、持久代) 



 关于Java堆3代分布情况,可通过命令:jmap –heap pid 查看:


 

 

1.3 GC过程

(1) 新生成的对象在Eden区完成内存分配

(2) 当Eden区满,再创建对象,会因为申请不到空间触发YGC,进行young(eden+1survivor)区的垃圾回收(为什么是eden+1survivor:两个survivor中始终有一个survivor是空的,空的那个被标记成To Survivor)

(3) YGC时,Eden不能被回收的对象被放入到空的survivor(也就是放到To Survivor,此时Eden被清空),另一个survivor(From Survivor)里不能被GC回收的对象也会被放入To Survivor,始终保证一个survivor是空的(YGC完成之后,To Survivor 和 From Survivor的标记互换)

(4) YGC结束后,若存放对象的survivor满,则这些对象被copy到old区,或者survivor区没有满,但是有些对象已经足够Old(超过XX:MaxTenuringThreshold),也被放入Old区

(5) 当Old区被放满的之后,进行完整的垃圾回收,即 FGC

(6) FGC后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现OOM错误

 

2. Java应用内存问题分析 

2.1 Java内存划分 

 2.1.1 堆内存

存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。


 2.1.2 
栈内存

 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配(更准确地说是保存了引用的堆内存空间的地址,java中的“指针”)。

 

 2.1.3 永久保存区、方法区(Permanent Generation)

用于存储已被虚拟机加载的类信息、常量、静态变量等。

 

2.2 Java常见内存问题 

---OutOfMemory:内存溢出

---Memory Leak:内存泄露 

 

二者共同点:

(1) 通常最终的状态就会导致OOM错误

(2) 在Java堆或本地内存中都可能发生

 

二者不同点:

(1) ML是已经分配好的内存或对象,当不再需要,没有得到释放 而OOM则是没有足够的空间来供jvm分配新的内存块

(2) ML的内存曲线总体上是一条斜向上的曲线而OOM不是,反之未必

 

2.3 内存溢出类型及解决方法:

2.3.1 java.lang.OutOfMemoryError: Java heap space

堆内存溢出

优化:通过-Xmn(最小值)–Xms(初始值) -Xmx(最大值)参数手动设置 Heap(堆)的大小。

 

2.3.2 java.lang.OutOfMemoryError: PermGen space

PermGen Space溢出(方法区溢出、运行时常量池溢出)

优化:通过MaxPermSize参数设置PermGen space大小。

 

2.3.3 java.lang.StackOverflowError

栈溢出(虚拟机栈溢出、本地方法栈溢出)

优化:通过Xss参数调整 

 

  • 大小: 67.1 KB
  • 大小: 159.6 KB
  • 大小: 89.2 KB
分享到:
评论

相关推荐

    was内存溢出 javacore分析工具jca 456

    在IT行业中,尤其是在Java应用程序的运行环境中,内存溢出(Memory Leak)是一个常见的问题,尤其在大型企业级应用服务器如WebSphere中。本篇将详细探讨如何利用Javacore分析工具JCA 456来诊断和解决这类问题。 ...

    was内存溢出 javacore分析工具jca 401

    JCA(Java Core Analysis)工具则是一款专门用来解析和分析javacore文件的工具,它能够帮助开发者深入理解内存溢出的问题,找出可能的内存泄露源,以及线程阻塞等问题。JCA401可能是该工具的一个特定版本,具有特定...

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    根据提供的文件内容,该文件主要讨论了在Java多线程环境下如何减少内存占用量。文件内容并不完整,且存在 OCR 扫描错误,但我会尝试从中提取与Java多线程和内存管理相关的知识点,并加以详细解释。 ### Java多线程...

    jvm分析工具JProfiler,java应用内存溢出堆栈快照分析工具

    JProfiler是一款专业的Java虚拟机(JVM)分析工具,它能够帮助开发者深入理解应用程序的性能瓶颈,优化内存管理,以及排查内存泄漏等问题。这款软件提供了丰富的功能,包括CPU使用率分析、内存分析、线程监控、类...

    jca javacore分析工具

    它们提供了关于JVM(Java虚拟机)运行状态的详细信息,帮助开发者识别和解决性能问题、内存泄漏以及线程阻塞等问题。JCA(Java Core Analysis)工具就是用于解析和分析这些文件的专业软件。 1. **Java Core (java...

    郑州总账内存溢出分析方法和结果

    本文将基于“郑州总账内存溢出分析方法和结果”的标题和描述,深入探讨如何通过分析javacore文本文件和heapdump二进制文件来诊断并解决内存溢出问题。 #### Javacore文件分析 ##### 文件生成 Javacore文件是在...

    java dump分析工具ha456

    `jstack`则是用来打印Java线程堆栈的工具,它能帮助我们了解程序的执行状态,查看是否有死锁、线程阻塞等问题。通过`jstack <pid>`命令,我们可以得到每个线程的调用栈信息,从而分析出哪些代码段可能导致了CPU过高...

    关于java堆内存溢出的几种情况

    Java堆内存溢出是应用程序运行过程中常见的问题,可能导致系统崩溃或者性能急剧下降。本文将详细介绍几种常见的Java堆内存溢出情况及其解决方案。 【情况一】:`java.lang.OutOfMemoryError: Java heap space` 这是...

    tomcat内存溢出总结

    本文将针对常见的几种内存溢出问题进行分析,并提供相应的解决策略。 #### 一、Java堆内存溢出(OutOfMemoryError: Java heap space) **概述**:当程序在运行过程中创建了大量的对象,而这些对象未能被垃圾回收...

    【JAVA WEB实用技巧与优化方案】如何排查JVM线程和内存相关问题

    IBM Heap Analyzer是一款专门用于分析Java heap dump的工具,它能够帮助开发者找出内存泄漏、过度的对象创建以及不合理的内存分配等问题。使用该工具,我们可以通过以下步骤进行分析: 1. **获取内存dump文件**:在...

    java内存模型.pdf

    在Java中,垃圾收集器通常能有效防止内存泄漏,但过度依赖静态变量、未关闭的资源(如数据库连接或文件流)等都可能导致内存泄漏。程序员需要注意及时释放不再使用的资源,确保内存的有效利用。 5. 本机内存: - ...

    jvm问题排查

    - 分析线程状态,如线程阻塞、死锁等问题。 - 查看线程的调用栈,了解线程执行的具体情况。 ##### 3. **jstat** - **命令格式**:`jstat -gcutil pid 1s` - **功能**:监控GC(垃圾收集)的信息,包括年轻代、老...

    Jvm堆栈dump文件分析

    5. **解读和优化**:根据分析结果调整JVM参数、优化代码、修复内存泄漏等问题,然后重新测试以验证改进效果。 总的来说,HeadAnalyzer 4.1.4是WebSphere环境下Java性能调优的重要工具,通过深入解析dump文件,它能...

    IBM内存分析工具javaAnalyzer.rar

    javacore文件则记录了JVM(Java虚拟机)在特定时刻的状态,包括线程、堆栈、CPU使用情况等,通常在遇到性能问题或者挂死时生成。 IBM的javaAnalyzer工具就是为了解析这些文件,帮助用户识别并解决内存问题。它无需...

    IBM Thread and Monitor Dump Analyzer for Java jca37

    jca37对javacore文件的解析能力强大,可以清晰地展示每个线程的状态,帮助开发者理解程序运行时的上下文,尤其是在多线程环境下,能有效识别死锁、线程阻塞等问题。 在使用jca37之前,我们需要了解如何生成和收集...

    Java 常见疑难解Java 常见疑难解

    在实际开发过程中,Java程序员经常会遇到各种各样的疑难问题,这些问题可能涉及到语法、类库、并发、内存管理等多个方面。本篇文章将深入探讨Java中的常见疑难问题,并提供解决方案。 1. **内存管理与垃圾回收**: ...

    解决JAVA服务器性能问题研究分析.doc

    【JAVA服务器性能问题研究分析】 在Java服务器的开发和运维过程中,性能问题是一个关键的考虑因素,尤其是在高负载环境下。解决此类问题需要深入理解服务器性能分析的概念和工具,以及如何在模拟环境中有效地测试和...

Global site tag (gtag.js) - Google Analytics