`
jinyanhui2008
  • 浏览: 319549 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

关于java堆栈溢出的那些事

    博客分类:
  • Java
阅读更多

java.lang.OutOfMemoryError: Java heap space

在java程序运行中可能会报如上的错误,通常是在运行过程中内存占用了没有别释放造成的。

以前可能没法跟踪可能是很痛苦的事情,现在好了,我们有一个调试软件可以用了,在生产环境下使用的jRockit软件进行调试,是oracle公司出品的。

前两天试用了一下真的很不错。

前阵子有个程序跑2个礼拜左右就会堆栈溢出,始终找不到头绪,后来使用jrockit才找到问题的出处。

jrockit是可以调试远程程序也可以调试本地程序的。

具体调试步骤

(一)

启动调试程序

 

如果是调试本地程序的话,启动jrockit,然后启动本地需要调试的程序,会在左侧工具栏 本地目录下创建一个连接为需要调试的程序,在上面点击右键,就会启动跟踪。

如何跟踪呢,我的办法就是等,在跟踪开始后,进行截图,然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量。

(二)

然后在上面点击右键,显示分配跟踪。

(三)

然后找到对应的方法,然后就去找问题吧,看看是不是那个地方有内存一直没有释放啊。

 

然后说点我自己的小经验,也许是不对的,但是我在我的应用里面确实是有效的。

 

在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。

用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。

基本上jrockit跟踪是很强的,都能够找到你的问题所在,要仔细观察,改完程序后记得再重新跟踪下直到没有内存泄露为止。

写完手工。

题外话,写多线程的时候建议使用线程池来操作。

分享到:
评论
8 楼 zhxing 2009-09-03  
lz 的jrockit mission control 哪里下载的,在官网上要注册才能下载,注册不了。
也想玩玩这个工具。
7 楼 jinyanhui2008 2009-09-03  
凤舞凰扬 写道
   首先给楼主一个翻译的错误,OutOfMemory是内存不够分配对象(可能是heap,也可能是permgen,也可能是其他的内存分配),堆栈溢出指的是StackOverflow。
    另外Jrockit是个不错的东东,但也不是什么地方都能用。比如在生产环境中,是不会开放debug的方式给你远程监控JVM或者打印堆栈信息的(我都不明白楼主的公司怎么可能开放生产环境用于调试)。
     所以,建议楼主是用JDK自带的命令吧。如果是用SUN的JDK,可以在重启服务器的时候使用jmap打印出heap中Oldgen的堆(dump file)或者是使用-XX:-HeapDumpOnOutOfMemoryError 使JVM在出现outofmemory的时候dump出内存信息。 这样你可以用许多工具进行分析,包括Jrockit以及Eclipse的MAT了。

这个问题,我是在别的网站上看的,所以才这么说的,要调试远程程序,远程使用的jre要用Jrockit的jre才行,具体怎么回事我找不到当时哪个网址了,记不得了。
但是他再生产环境下调试本地程序是没问题的,这是我已经测试过的。
或者我说的堆栈溢出并不准确,我觉得能解决问题才是最大的。
6 楼 凤舞凰扬 2009-09-02  
   首先给楼主一个翻译的错误,OutOfMemory是内存不够分配对象(可能是heap,也可能是permgen,也可能是其他的内存分配),堆栈溢出指的是StackOverflow。
    另外Jrockit是个不错的东东,但也不是什么地方都能用。比如在生产环境中,是不会开放debug的方式给你远程监控JVM或者打印堆栈信息的(我都不明白楼主的公司怎么可能开放生产环境用于调试)。
     所以,建议楼主是用JDK自带的命令吧。如果是用SUN的JDK,可以在重启服务器的时候使用jmap打印出heap中Oldgen的堆(dump file)或者是使用-XX:-HeapDumpOnOutOfMemoryError 使JVM在出现outofmemory的时候dump出内存信息。 这样你可以用许多工具进行分析,包括Jrockit以及Eclipse的MAT了。
5 楼 jinyanhui2008 2009-09-02  
kekeemx 写道
补充一点:楼主指的是jrockit的mission control. 使用他的时候需要使用jrockit jvm并在增加vm参数才可以。
另:jrockit的java runtime analyzer(jra)和memleak是需要lisense key的..开发人员免费用的好像才1个小时使用时间。。。。
楼主哪里弄的key?


bea被oracle收购后,此软件已经免费了,另外我是调试本地程序,所以使用Oracle JRockit Mission Control 就可以了,如果要调试远程客户端的话,需要在远程客户端安装jvm才行,并且需要填上相应的启动参数。
4 楼 kekeemx 2009-09-01  
补充一点:楼主指的是jrockit的mission control. 使用他的时候需要使用jrockit jvm并在增加vm参数才可以。
另:jrockit的java runtime analyzer(jra)和memleak是需要lisense key的..开发人员免费用的好像才1个小时使用时间。。。。
楼主哪里弄的key?
3 楼 jinyanhui2008 2009-09-01  
SSailYang 写道
jrockit 应该是bea的吧,后来bea被oracle收购了

对的。。。开始我也想说是bea的,但是想了想既然被收购了,还是直接用oracle吧
2 楼 SSailYang 2009-08-31  
jrockit 应该是bea的吧,后来bea被oracle收购了
1 楼 fpjason 2009-08-31  
不错,实践出真知呀

相关推荐

    linux 堆栈溢出的问题

    【Linux堆栈溢出问题详解】 堆栈溢出是一种常见的软件安全漏洞,尤其在Linux和Unix系统中。这种漏洞允许攻击者通过向程序的堆栈区域写入超出预期的数据量来破坏程序的正常运行,从而可能获取更高的权限,如root权限...

    java 堆栈的演示程序

    3. 如何处理堆栈溢出异常(StackOverflowError),这通常发生在递归调用过深或者无限循环时。 4. 深入理解JVM的内存模型,特别是堆栈和堆的区别,以及垃圾回收对堆的影响。 总之,这个"java 堆栈的演示程序"为我们...

    java堆栈详解 PDF 下载

    本文将深入探讨Java堆栈的概念、工作原理以及它们在程序执行中的角色。 1. 堆(Heap) - 堆是Java内存模型中的主要部分,主要用于存储对象实例。所有的类实例和数组都在堆中分配内存。 - 堆内存是动态分配的,...

    JAVA内存溢出详解.doc

    Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...

    JAVA内存溢出

    Java程序的每个线程中都有一个独立的堆栈。 容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。 第一种OutOfMemoryError:PermGen space 这种问题的原因为程序中使用了大量的jar或...

    Java堆栈内存分析笔记

    Java堆栈内存分析是Java编程中的重要概念,它关乎程序的性能优化和内存泄漏的预防。堆和栈是Java内存管理的两个主要区域,它们各自承担着不同的职责。本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。...

    堆栈溢出1

    Java 堆栈溢出与 JVM 垃圾回收机制 Java 堆栈溢出是指 Java 应用程序在堆栈中存储的数据超过了堆栈的容量限制,从而导致程序崩溃的一种错误。这种错误通常是由于程序中的循环递归或死循环引起的。 在 Java 虚拟机...

    java堆栈的区别 -- 详解

    ### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...

    java内存溢出原因

    本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space溢出以及Native Heap溢出,并提供相应的解决方案。 1. **JVM PermGen space溢出** - ** PermGen space** 是JVM内存模型中的...

    堆栈溢出的解决方法

    堆栈溢出的解决方法 在计算机科学中,栈溢出是一种常见的编程错误,发生在程序的栈空间不足以存储所有的局部变量和函数调用信息时。如果栈溢出不被及时解决,可能会导致程序崩溃或出现未知的错误。因此,了解栈溢出...

    【IT十八掌徐培成】Java基础第04天-04.OOP-堆栈的溢出与设置-private关键字.zip

    本课程由IT十八掌徐培成讲解的"Java基础第04天-04.OOP-堆栈的溢出与设置-private关键字"深入探讨了两个关键主题:堆栈溢出和private关键字的使用。 首先,让我们来理解堆栈溢出。在计算机编程中,内存分为堆和栈两...

    stackoverflow-1134894:堆栈溢出问题“Maven2

    以下是关于Java和Maven2在处理堆栈溢出问题以及企业项目最佳实践的一些详细知识点: 1. **Maven配置**:Maven的`pom.xml`文件是项目的核心配置,其中可以设置堆栈大小。通过添加`-Xms`和`-Xmx`参数到`...

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

    当Java应用出现内存溢出问题时,JProfiler可以生成堆栈快照,这有助于分析导致内存溢出的具体原因。通过堆栈快照,开发者可以看到对象的引用链,找出持有大对象的根源,以便进行针对性的优化。 **5. 线程监控** ...

    介绍堆栈,线程 如何解决内存溢出

    同时,“内存溢出问题.txt”将提供关于内存溢出的实例和解决方案,帮助你更好地应对这类问题。“堆栈说明.txt”则会深入讲解堆栈的工作原理、栈溢出及其预防措施。 通过深入学习和实践这些知识,你将能够有效地管理...

    android-espresso-strange-work:连接到我的堆栈溢出问题 - http

    连接到我的堆栈溢出问题 - 这个项目是在 android 上测试 espresso。 没有“哈克”我就无法让它工作 为了使它工作,我必须注释这段代码: Espresso . onView( ViewMatchers . withId( R . id . email)) . perform( ...

    图片过大引起的内存溢出解决方案

    ### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...

    stackoverflow-alert:堆栈警报是为Swift回答堆栈溢出问题而设计的Firefox扩展。 如果您是站点stackoverflow的活跃成员,则可能需要这样做。 当“最新的'java'问题-堆栈溢出”页面上出现新的问题时,此插件将通知您。它还会播放小声音。 例如,您正在看书,而无需每次都查看是否有新问题,因为如果有任何新问题,此插件将通知您。 目前仅适用于Windows操作系统和浏览器firefox。 您可以尝试..xpi可以在构建文件夹中找到

    当“最新的'java'问题-堆栈溢出”页面上出现新的问题时,此插件将通知您。它还会播放小声音。 例如,您正在看书,而无需每次都查看是否有新问题,因为如果有任何新问题,此插件将通知您。 目前仅适用于Windows操作...

    java内存泄露、溢出检查方法和工具

    ### Java内存泄露、溢出检查方法及工具详解 #### 一、引言 在实际的项目开发和运维过程中,经常会遇到Java应用程序出现内存溢出(`java.lang.OutOfMemoryError`)的情况。这类问题不仅影响应用程序的稳定性和性能...

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

    标题中的“was内存溢出 javacore分析工具jca 401”指的是在WebSphere应用服务器(WAS)环境中,出现内存溢出问题时,使用名为JCA(Java Core Analysis)401的工具进行分析的情况。内存溢出是程序运行过程中,因分配...

Global site tag (gtag.js) - Google Analytics