`
midstr
  • 浏览: 33223 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对jvm内存的一些理解

阅读更多
首先引用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">&nbsp;</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">&nbsp;</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内存模型概览 ...综上所述,理解JVM内存分配机制对于Java开发者来说至关重要,这不仅有助于编写高效、稳定的代码,还能在遇到性能瓶颈时快速定位问题并进行优化。

    idea插件JVM内存工具JProfiler11

    《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...

    JVM内存管理白皮书

    此外,文档的结构化布局使得内容条理清晰,即使是初学者也能够逐步建立起对JVM内存管理的全面认识。通过这份白皮书的学习,读者将能够深入理解JVM内存管理的复杂性,并掌握处理内存问题的有效方法。

    jvm 内存分析文档

    理解JVM内存结构和内存分配机制对于避免内存溢出(OutOfMemoryError)、提升程序性能、减少垃圾回收开销至关重要。开发者应关注内存配置、对象生命周期管理以及适当的垃圾回收策略,以优化应用程序的性能和稳定性。

    java获得jvm内存大小

    在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是程序共享的内存区域,用于存储对象实例和数组。 2. **方法区(Method Area)**:用于存储类的...

    (二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.

    MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...

    jvm内存监控工具使用

    ### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...

    JVM内存配置优化

    #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组等引用类型的数据。在...

    mat(mac)---jvm内存分析工具

    总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...

    JVM内存参数详解以及配置调优

    本资源详细讨论了 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面,为开发人员和运维人员提供了一份详细的指南,以帮助他们更好地理解和优化 JVM 的性能。

    JVM内存日志

    在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...

    jvm内存分析工具mat

    在JVM内存管理中,内存泄漏是一种常见的性能问题,可能导致应用运行缓慢,甚至崩溃。MAT通过解析JVM生成的hprof文件(内存快照),可以深入分析堆内存的各个部分,包括对象分配、存活状态、引用关系等,帮助定位问题...

    JVM 内存结构及配置总结

    理解JVM内存结构和配置对于优化Java应用程序性能至关重要。正确的参数配置能够避免内存溢出、提高垃圾收集效率,从而提升整体系统性能。在实际应用中,开发者需要根据应用程序的特性和需求,灵活调整这些参数。同时...

    JVM内存结构.pdf

    通过对JVM内存各部分的认识,我们可以更有效地管理和优化资源使用,提高应用程序的整体性能。此外,熟悉类加载机制和JDK提供的各种调优工具,也是解决性能问题的关键所在。希望本文能帮助读者深入理解JVM的核心概念...

    Tomcat JVM内存设置方法

    #### 二、理解JVM内存模型 在深入探讨如何设置Tomcat的JVM内存之前,我们需要先了解JVM内存的基本结构。JVM内存主要分为以下几个部分: 1. **堆内存(Heap Memory)**:这是JVM管理的主要内存区域之一,用于存储...

    JVM 深入学习教程深入分析JVM教程!jvm 内存原型,优化等等

    本教程将涵盖JVM内存模型、内存分配以及优化策略。 一、JVM内存模型 1. 堆内存:堆是所有线程共享的一块内存区域,主要用于存储对象实例。Java中的动态内存分配主要在堆上进行,垃圾收集器也会对堆进行管理,进行...

    JVM-内存管理 2012-12.pdf

    JVM内存管理是Java平台的一个重要特性,其内存空间的分配和回收机制对Java应用程序的性能和稳定性有着至关重要的影响。 首先,JVM内存管理涉及的内存空间主要分为方法区(Method Area)、堆(Heap)、本地方法栈...

    jvm内存管理,pdf

    通过以上内容可以看出,深入理解JVM内存管理和垃圾收集机制对于提高应用程序的性能至关重要。尽管现代JVM已经非常智能,能够自动管理大部分内存相关的工作,但在面对复杂的应用场景时,仍然需要开发人员具备一定的...

    jvm内存状况查看

    JVM内存主要分为年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)(在Java 8之后被元空间(Metaspace)取代)。年轻代进一步细分为eden区、survivor区(From和To)以及老年代...

    在Eclipse状态栏上增加JVM内存用量指示器

    标题 "在Eclipse状态栏上增加JVM内存用量指示器" 涉及到的是一个关于Eclipse集成开发环境(IDE)的自定义配置和优化技术。Eclipse是一款广泛使用...这个过程需要对Eclipse的插件系统、JVM内存管理和配置有一定的了解。

Global site tag (gtag.js) - Google Analytics