首先引用jdk1.5api的doc:
内存
Java 虚拟机的内存系统管理以下类型的内存:
1. 堆
Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为垃圾回收器 的自动内存管理系统回收。
堆的大小可以固定,也可以扩大和缩小。堆的内存不需要是连续空间。
2. 非堆内存
Java 虚拟机管理堆之外的内存(称为非堆内存)。
Java 虚拟机具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机启动时创建的。
方法区在逻辑上属于堆,但 Java 虚拟机实现可以选择不对其进行回收或压缩。与堆类似,方法区的大小可以固定,也可以扩大和缩小。方法区的内存不需要是连续空间。
除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。
在网上找到如下的jsp来监视内存使用情况:
<%@ page import="java.lang.management.*" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JVM Memory Monitor</title>
</head>
<body>
<table border="0" width="100%">
<tr><td colspan="2" align="center"><h3>Memory MXBean</h3></td></tr>
<tr><td
width="200">Heap Memory Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
%></td></tr>
<tr><td>Non-Heap Memory
Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
%></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2" align="center"><h3>Memory Pool MXBeans</h3></td></tr>
<%
Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator();
while (iter.hasNext()) {
MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next();
%>
<tr><td colspan="2">
<table border="0" width="100%" style="border: 1px #98AAB1 solid;">
<tr><td colspan="2" align="center"><b><%= item.getName() %></b></td></tr>
<tr><td width="200">Type</td><td><%= item.getType() %></td></tr>
<tr><td>Usage</td><td><%= item.getUsage() %></td></tr>
<tr><td>Peak Usage</td><td><%= item.getPeakUsage() %></td></tr>
<tr><td>Collection Usage</td><td><%= item.getCollectionUsage() %></td></tr>
</table>
</td></tr>
<tr><td colspan="2"> </td></tr>
<%} %>
</table>
</body>
</html>
使用的结果(JDK1.5)正如doc描述:
从检测的结果来看,non-heap memory中,包含了perm gen和一部分jvm自用的内存
其中heap memory的最大值即我们指定的启动参数 -Xmx1024m所指定的1024m
而Perm Gen的最大值即为我们指定的启动参数 -XX:MaxPermSize=128m 所指定的128m(不指定默认为64m)
一般的OutOfMemory大部分是因为上面两个配置参数不够引起的。
当然native heap 也可以产生OutOfMemory,如果os的java可用内存全部分给heap了。
如果发生oom,个人觉得首先是调整参数,比如:-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m
如果参数调整之后还是oom,则需要考虑优化程序了(当然首先要把死递归,死循环排除),最好是用工具监测一下。
附我们tomcat配置参数修改方案:
² Tomcat配置的修改(%tomcat%表示tomcat实际安装目录)
如果tomcat安装在Solaris环境下,打开 %tomcat%\bin\catalina.sh 文件,在文件的前面加下面红色字体的内容(注意有双引号):
LANG=zh_CN.GB18030
export LANG
JAVA_OPTS="-server -Xms<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1024" unitname="m">1024m</chmetcnv> -Xmx<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1024" unitname="m">1024m</chmetcnv> -XX:PermSize=<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="128" unitname="m">128m</chmetcnv> -XX:MaxPermSize=<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="128" unitname="m">128m</chmetcnv>"
export JAVA_OPTS
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
echo $JAVA_OPTS
如果tomcat安装在Windows环境下,打开 %tomcat%\bin\catalina.bat 文件,在文件的前面加下面红色字体的内容(注意没有双引号):
set JAVA_OPTS=-server -Xms<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1024" unitname="m">1024m</chmetcnv> -Xmx<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1024" unitname="m">1024m</chmetcnv> -XX:PermSize=<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="128" unitname="m">128m</chmetcnv> -XX:MaxPermSize=<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="128" unitname="m">128m</chmetcnv>
打开 %tomcat%\conf\server.xml 文件,下面这行:
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
改成:
maxThreads="250" minSpareThreads="25" maxSpareThreads="100"
分享到:
相关推荐
### JVM内存空间分配详解 #### 一、JVM内存模型概览 ...综上所述,理解JVM内存分配机制对于Java开发者来说至关重要,这不仅有助于编写高效、稳定的代码,还能在遇到性能瓶颈时快速定位问题并进行优化。
《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...
此外,文档的结构化布局使得内容条理清晰,即使是初学者也能够逐步建立起对JVM内存管理的全面认识。通过这份白皮书的学习,读者将能够深入理解JVM内存管理的复杂性,并掌握处理内存问题的有效方法。
理解JVM内存结构和内存分配机制对于避免内存溢出(OutOfMemoryError)、提升程序性能、减少垃圾回收开销至关重要。开发者应关注内存配置、对象生命周期管理以及适当的垃圾回收策略,以优化应用程序的性能和稳定性。
在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是程序共享的内存区域,用于存储对象实例和数组。 2. **方法区(Method Area)**:用于存储类的...
MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
#### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组等引用类型的数据。在...
总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...
本资源详细讨论了 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面,为开发人员和运维人员提供了一份详细的指南,以帮助他们更好地理解和优化 JVM 的性能。
在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...
在JVM内存管理中,内存泄漏是一种常见的性能问题,可能导致应用运行缓慢,甚至崩溃。MAT通过解析JVM生成的hprof文件(内存快照),可以深入分析堆内存的各个部分,包括对象分配、存活状态、引用关系等,帮助定位问题...
理解JVM内存结构和配置对于优化Java应用程序性能至关重要。正确的参数配置能够避免内存溢出、提高垃圾收集效率,从而提升整体系统性能。在实际应用中,开发者需要根据应用程序的特性和需求,灵活调整这些参数。同时...
通过对JVM内存各部分的认识,我们可以更有效地管理和优化资源使用,提高应用程序的整体性能。此外,熟悉类加载机制和JDK提供的各种调优工具,也是解决性能问题的关键所在。希望本文能帮助读者深入理解JVM的核心概念...
#### 二、理解JVM内存模型 在深入探讨如何设置Tomcat的JVM内存之前,我们需要先了解JVM内存的基本结构。JVM内存主要分为以下几个部分: 1. **堆内存(Heap Memory)**:这是JVM管理的主要内存区域之一,用于存储...
本教程将涵盖JVM内存模型、内存分配以及优化策略。 一、JVM内存模型 1. 堆内存:堆是所有线程共享的一块内存区域,主要用于存储对象实例。Java中的动态内存分配主要在堆上进行,垃圾收集器也会对堆进行管理,进行...
JVM内存管理是Java平台的一个重要特性,其内存空间的分配和回收机制对Java应用程序的性能和稳定性有着至关重要的影响。 首先,JVM内存管理涉及的内存空间主要分为方法区(Method Area)、堆(Heap)、本地方法栈...
通过以上内容可以看出,深入理解JVM内存管理和垃圾收集机制对于提高应用程序的性能至关重要。尽管现代JVM已经非常智能,能够自动管理大部分内存相关的工作,但在面对复杂的应用场景时,仍然需要开发人员具备一定的...
JVM内存主要分为年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)(在Java 8之后被元空间(Metaspace)取代)。年轻代进一步细分为eden区、survivor区(From和To)以及老年代...
标题 "在Eclipse状态栏上增加JVM内存用量指示器" 涉及到的是一个关于Eclipse集成开发环境(IDE)的自定义配置和优化技术。Eclipse是一款广泛使用...这个过程需要对Eclipse的插件系统、JVM内存管理和配置有一定的了解。