`
wangyi1132
  • 浏览: 4305 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JVM内存限制问题解决方案

    博客分类:
  • java
阅读更多
JVM内存限制解决方案

众所周知,JVM内存是受限的,一为机器的体系架构,二为操作系统本身。x86,x86-64,SPARC,.....的内存映射是不同,而各操作系统的内存管理机制也有区别。

1.Heap设定与垃圾回收

JavaHeap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。

JVM的Heap分配可以使用-X参数设定



JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

为什么一些程序频繁发生GC?有如下原因:

◆程序内调用了System.gc()或Runtime.gc()。

◆一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。

◆Java的Heap太小,一般默认的Heap值都很小。

◆频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。

如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。

经验之谈:

1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2]。

2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成[2]。

注意:

1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。

2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

2.Stack的设定

每个线程都有他自己的Stack。



Stack的大小限制着线程的数量,也就是说会出现JVM内存限制。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。

3.硬件环境

硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。

4.4种GC

这里来看一下四种垃圾回收机制,通过JVM垃圾回收可以一定程度上解决JVM内存限制问题。

第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。

第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。

第三种为ConcurrentLowPauseGC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。

第四种为IncrementalLowPauseGC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
分享到:
评论

相关推荐

    关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论

    标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...

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

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

    Jvm内存面试问题总结(2020).docx

    - 永久代被移除,类元数据存储在元空间中,避免了JVM内存限制。 - 常量池从永久代移到了堆内存中。 3. JVM运行过程: - 类加载器加载类到元空间。 - Spring容器通过反射技术创建对象实例,对象存储在堆内存中。...

    jvm内存溢出

    ### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。

    vmmap 观察jvm内存 监控jvm jvm线程

    在Java开发过程中,对JVM(Java虚拟机)的监控是至关重要的,它能帮助我们了解应用程序的运行状态,优化性能,以及及时发现并解决内存泄漏等问题。`vmmap`工具是Mac OS X系统中一个强大的内存分析工具,它可以用来...

    MyEclipse内存不足谈谈JVM内存

    ### MyEclipse内存不足与JVM内存管理 #### 1. 各个参数的含义 在探讨具体的参数之前,我们先来了解下JVM内存管理的基本...通过上述分析,我们可以更好地理解JVM内存管理机制以及如何解决MyEclipse内存不足的问题。

    JVM内存管理学习笔记

    深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、垃圾收集机制以及相关工具的使用等方面进行详细的探讨。 一、JVM内存模型 JVM内存主要分为五个区域:...

    JVM内存模型及分区 JVM内存模型及分区

    理解JVM内存模型对于优化Java程序性能至关重要,合理分配和管理内存能有效避免内存泄漏和性能瓶颈。例如,通过调整堆大小、设置合理的垃圾回收策略,可以优化应用的运行效率。此外,了解这些内存区域的工作原理也能...

    Java内存泄露及内存无法回收解决方案

    本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并提供相应的解决方案。 首先,我们要了解Java内存模型。Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method...

    jvm内存的运作

    尽管如此,这种自动化管理也可能导致一些问题,如内存泄漏和内存溢出,尤其是在不了解JVM内存管理机制的情况下,这些问题往往难以定位和解决。 #### 二、JVM运行时数据区域详解 JVM在执行Java程序的过程中,会使用...

    jvm内存详解

    在了解JVM内存的高级概念之后,开发者能够更好地理解Java应用程序的性能问题,并采取措施优化JVM内存使用,例如调整堆内存大小、进行垃圾回收调优、使用本地内存优化技术以及提高代码效率。这有助于避免内存耗尽导致...

    一文搞懂JVM内存结构

    总之,理解和掌握JVM内存结构对于Java开发者来说是至关重要的,它可以帮助我们编写更高效、更稳定的代码,解决运行时可能出现的问题,并进行有效的性能调优。通过不断学习和实践,我们可以更好地驾驭这台强大的虚拟...

    Tomcat JVM内存优化(Linux环境)

    通过上述方法可以有效地解决Linux环境下Tomcat服务器中的JVM内存溢出问题。需要注意的是,内存优化是一个持续的过程,需要根据应用的具体情况不断调整和优化。此外,合理设计应用程序架构和代码逻辑也是减少内存消耗...

    JVM内存结构

    在Java 8之前,这部分被称为永久代,后来改为了元空间,以减少对JVM内存的限制。 6. **直接内存(Direct Memory)**:非JVM堆内存的一部分,但对性能有显著影响。通过NIO(New Input/Output)库可以直接在直接内存...

    如何设置Tomcat的JVM虚拟机内存大小

    针对内存溢出的解决方案主要有两个方向: **1. 代码优化**: - 优化程序设计,减少全局变量的使用,确保对象在使用完毕后及时释放引用,以便垃圾收集器(GC)可以回收。 - 避免过度的内存消耗,如一次性加载大量...

    JVM内存资料.zip_jdk

    《JVM内存模型深度探索——基于JDK源码解析》 在Java开发中,深入理解JVM(Java Virtual Machine)内存模型是至关重要的。本文将从JDK源码的角度出发,详细探讨JVM的内存结构、类加载机制以及对象创建与内存分配...

    JVM内存模型一些简单的概述

    了解JVM内存模型对于开发者来说至关重要,因为它有助于识别和解决性能问题,如内存泄漏、栈溢出和垃圾收集效率低等问题。通过优化内存分配、管理对象生命周期和理解垃圾收集机制,我们可以显著提高Java应用的效率和...

    kettle内存溢出(Java heap space)以及解决方法.docx

    1. **大数据量处理**:当Kettle处理大量数据时,如在表输入、表输出、聚合、Join、过滤等步骤中,如果一次性加载太多数据到内存,可能会超出JVM的堆内存限制。 2. **内存管理不当**:Kettle的默认配置可能不适合特定...

Global site tag (gtag.js) - Google Analytics