`
microjava
  • 浏览: 318558 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何定位某个线程内存空间申请大对象?

阅读更多
官方文档:
http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21236523

问题

当您进行分析Java Heap内存碎片和内存泄漏问题时,经常会发现大对象内存频繁申请,会直接导致应用服务器的崩溃。那么我们如何来定位由哪个应用模块的哪个Class类的哪个方法直接导致大对象的产生,从而导致服务器宕机?


解决方案
自从IBM SDK 1.3.1 Sovereign Service Release 10 以后的版本 (或构建日期2006年5月5日以后) 和 IBM SDK 1.4.2 Sovereign Service Release 4以后的版本,我们可以设置环境变量ALLOCATION_THRESHOLD 来定义内存申请的上限值。
如果内存对象申请的大小超过此上限,Java虚拟机会自动打印出类似与Java Exception 异常堆栈日志信息的类方法诊断信息,来定位到底是由哪个对象的哪个方法向内存申请了大对象空间。

输出日志类似:
Allocation request for bytes
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.skipString(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.batik.dom.util.SAXDocumentFactory.createDocument(Unknown Source)

如果您把ALLOCATION_THRESHOLD环境变量设置为nnn (bytes), 一旦应用申请对象的大小大于nnn (bytes)时, 当前运行线程的Java类方法调用级联堆栈信息就会自动打印到native_stderr.log日志文件中了。

比如以下测试案例代码:
import java.io.*;
public class largeobj {
static int limit = 20;
static int size1 = 1000000;
static int size2 =2*size1;
public static void main(String []args) throws IOException {
for (int index0=0; true; index0++) {
if (0 == index0 % 100) System.out.println(index0);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(String.class);
oos.close();
Object array1 = null;
for(int i1=0; i1 System.out.println("" + i1);
array1 = new Object ;
for (int i2=0; i2 array1 = new Object;
}
}
array1=null;
}
}
}


如果您把JVM运行的环境变量设置如下:
export ALLOCATION_THRESHOLD=5000000

当申请对象的大小超过设定的上限值时,那您会获得以下打印日志信息:

Allocation request for 8000016 bytes
at largeobj.main(largeobj.java:18)

同样您也可以在WebSphere Application Server V5.1.1 and V6.0以后的版本中,设置ALLOCATION_THRESHOLD环境变量。


关于如何在WebSphere Application Server V5.1.1 and V6.0以后版本的服务器中设置ALLOCATION_THRESHOLD环境变量,请参考以下步骤:

WebSphere Application Server 6.0
可以通过在WebSphere Application Server versions 6.0 and 6.0.1的管理控制台中,按照以下步骤加入对应的环境变量:
1、 打开WebSphere Web管理控制台。
2、选择 Servers > Application Servers > server_name > Java and Process Management > Process Definition > Environment Entries > New.
3、 如果您使用WebSphere Application Server 6.0.2以后的版本, 按照如下顺序选择进入: Application servers > server_name > (Expand Java and Process Management) > Process Definition > Custom Properties
4、 增加以下名称和对应的值:
Name: ALLOCATION_THRESHOLD
Value: value
5、 最后确认新增配置的保存,再重新启动应用服务器。


WebSphere Application Server 5.1.1
可以通过在WebSphere Application Server versions 5.1.1的管理控制台中,按照以下步骤加入对应的环境变量:
1、 打开WebSphere Web管理控制台。
2、 选择 Servers > Application Servers > server_name > Process Definition > Environment Entries > New.
3、 增加以下名称和对应的值:
Name: ALLOCATION_THRESHOLD
Value: value
4、 最后确认新增配置的保存,再重新启动应用服务器。
分享到:
评论

相关推荐

    项目:内存“银行”压测

    项目:内存“银行”压测 ...这里我们可以通过条件编译将对应平台下向堆申请内存的函数进行封装,此后我们就不必再关心当前所在平台,当我们需要直接向堆申请内存空间时,就可以直接调用封装后的函数。

    高性能内存申请nedmalloc_v1.06beta2_svn1159

    1. **内存分配策略**:nedmalloc采用了多级分配策略,将不同大小的内存块分到不同的分配区域,比如小对象池和大对象区。这样可以减少内存碎片并提高分配效率。对于小对象,它使用了位图来跟踪空闲块,对于大对象则...

    动态连接库中的内存释放

    本文件探讨的是如何在DLL中正确地进行内存申请和释放。 首先,我们来看DLL中的`DllFunc()`函数,它通过`new`关键字动态分配了一个整型指针`p`,并将其返回给调用者。在C++中,`new`操作符会为对象分配内存,并自动...

    Android内存泄漏调试教程

    内存泄漏指的是程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能问题不大,但随着时间推移,积累起来会导致应用程序占用内存持续增加,甚至可能导致应用无响应(ANR)或者系统资源耗尽。...

    内存分配源代码MemoryAllocation.rar

    2. **内存池**:为了提高内存分配效率,JVM可能会使用内存池技术,预先分配一大块内存,然后从中按需分配小块内存给对象。这可以减少系统调用的开销。 3. **内存泄漏检测**:尽管有垃圾回收机制,但开发者仍需要...

    易语言内存结束线程源码-易语言

    内存结束不仅仅是简单地停止线程,还涉及到清理该线程占用的内存空间,防止内存泄漏,确保系统的稳定运行。 "内存结束线程"这个源代码很可能是通过易语言提供的API或内置函数来实现线程的结束,并且在结束线程的...

    理解Java垃圾回收

    - **对象生命周期**:当程序创建一个对象时,Java虚拟机(JVM)会在堆内存中为这个对象分配内存空间。一旦对象不再被任何引用指向,那么这个对象就成为了垃圾。 - **垃圾回收目标**:回收不再使用的对象所占用的...

    smzy_poolmon.zip

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,久而久之,系统可用内存会越来越少,可能导致系统性能下降甚至崩溃。了解并使用Poolmon可以帮助我们定位这些问题,确保系统的稳定运行。 Poolmon 的核心...

    iOS-面试宝典3.0.pdf

    - **内存泄漏**:当程序创建了一个对象后没有正确释放,导致无法回收该对象所占用的内存空间。 - **内存溢出**:当程序申请的内存超过系统所能提供的最大内存限制时。 #### 六、[NSArray arrayWithobject:]这个方法...

    JVM与性能优化知识点整理.pdf

    如果Java栈容量可以动态扩展,但扩展时无法申请到足够的内存空间,则会抛出`OutOfMemoryError`异常。 #### 二、JVM执行子系统 ##### 1. Class类文件结构 Class文件是Java程序编译后的结果,包含了Java虚拟机能够...

    Java并发编程面试题(2024最新版)-重点.docx

    - **目的:**自动回收不再使用的对象所占用的内存空间,减少内存泄漏的风险。 - **时机:**垃圾回收器会自动触发,通常在系统空闲时进行。 **3. 重排序与数据依赖性:** - **重排序:**编译器和处理器可能会为了...

    面试题--北京亚信C++.doc

    ### 面试题知识点解析 #### 1. 你希望做哪方面的工作 - **解析**:这是一个开放性问题,旨在了解应聘者的兴趣方向及职业规划。...- **注意事项**:虽然引用本身不占用内存空间,但它指向的对象仍然占用内存空间。

    阿里面试题总结和答案整理

    GC用的引用可达性分析算法中,哪些对象可作为GC Roots对象? - **知识点概述**:可达性分析算法是确定对象是否可以被回收的主要方法。 - **GC Roots对象**: - 正在执行的方法中的局部变量。 - 方法调用栈中的...

    C#通过WIN32API获取外部程序sysListview的值和TreeView的值.pdf

    2. GetWindowThreadProcessId 函数:用于获取某个窗口的创建者线程或进程标志符。函数原型为 `DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );`。其中,`hWnd` 是被查找窗口的句柄,`...

    天津理工大学复试总结.docx

    数组和链表是两种常见的数据结构,数组的特点是在内存中是一块连续的区域,数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存...

    tomcat的优化

    应用程序可能需要较大的内存来存储持久化对象。为了避免内存溢出错误并确保应用稳定运行,一般建议使用物理内存的80%作为堆的最大值。 #### 五、其他注意事项 除了上述提到的优化措施外,还有一些其他方面的考虑...

    操作系统实验指导书

    - **日志记录**:记录每个线程的关键操作(如申请、开始和结束读写操作)。 3. **相关基础知识** - **生产者和消费者模型**:介绍模型的特点,包括非循环的缓冲区管理和消费者对指定生产者产品的消费。 - **同步...

    holes:toooo biiiggggg

    标题 "holes:toooo biiiggggg" 和描述 "Kong toooo biiiggggg" 提供的信息似乎与编程中的一个概念有关,可能是关于数据类型大小的问题或者是某个程序或对象规模过大的表述。考虑到标签是"C++",我们可以推测这可能与...

Global site tag (gtag.js) - Google Analytics