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

jvm内存调优

 
阅读更多
JVM 调优,首先应从内存开始,尤其是在真正的的web服务部署的时候。因为真正的web服务会比开发的时候花费更多的内存,用来处理多用户并发的情况。本人多次吃过这方面的亏,所以整理一下,希望能给别人以帮助。

这个年头变啦,内存变得如大白菜,每个新装的机器都2G以上的内存,甚至4G,也不是什么新闻。而软件‘吃’内存的情况则变化不大(除了VIsta)。但 JAVA诞生的时候可不是这样——95年,想来当年97年,64M的内存还要500元,所以JVM初始化对内存的要不能太大,而且也要考虑老机器的情况,毕竟现在JRE基本跑在每个人的机器上。但是JVM初始占用还停留在几年前的情况下,确实没有跟上软件和硬件的发展。而像Tomcat, JBoss, Eclipse(尤其安上MyEclipse插件后),也考虑到每台机器的内存情况,所以初始话定义都很低,经常会抛内存溢出Bug。

好,言归正传。我们先从解决bug开始,当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,如果GC完还是不够,或者申请的直接超够VM可能有的,就会抛出内存溢出异常。从VM规范中我们可以得到,一下几种异常。

java.lang.StackOverflowError:(很少)
java.lang.OutOfMemoryError:heap space(比较常见)
java.lang.OutOfMemoryError: PermGen space (经常出现)

以下分别解释一下,从最常见的开始:

java.lang.OutOfMemoryError: PermGen space 这个异常比较常见,是说JVM里的Perm内存区的异常溢出,由于JVM在默认的情况下,Perm默认为64M,而很多程序需要大量的Perm区内存, 尤其使用到像Spring等框架的时候,由于需要使用到动态生成类,而这些类不能被GC自动释放,所以导致OutOfMemoryError: PermGen space异常。解决方法很简单,增大JVM的 -XX:MaxPermSize 启动参数,就可以解决这个问题,如过使用的是默认变量通常是64M[5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.],改成128M就可以了,-XX:MaxPermSize=128m。如果已经是128m(Eclipse已经是128m了),就改成 256m。我一般在服务器上为安全起见,改成256m。

java.lang.OutOfMemoryError:heap space或 其它OutOfMemoryError,这个异常实际上跟上面的异常是一个异常,但解决方法不同,所以分开来写。上面那个异常是因为JVM的perm区内存区分少了引起的(JVM的内存区分为 young,old,perm三种)。而这个异常是因为JVM堆内存或者说总体分少了。解决方法是更改 -Xms -Xmx 启动参数,通常是扩大1倍。xms是管理启动时最小内存量的,xmx是管里JVM最大的内存量的。
注:OutOfMemoryError可能有很多种原因,根据JVM Specification, 可能有一下几种情况,我先简单列出。stack:stack分区不能动态扩展,或不足以生成新的线程。Heap:需要更多的内存,而不能获得。Method Area :如果不能满足分配需求。runtime constant pool(从Method Area分配内存)不足以创建class or interface。native method stacks不能够动态扩展,或生成新的本地线程。

最后说说java.lang.StackOverflowError,老实说这个异常我也没碰见过,但JVM Specification就提一下,规范上说有一下几种境况可能抛出这个异常,一个是Stacks里的线程超过允许的时候,另一个是当native method要求更大的内存,而超过native method允许的内存的时候。根据SUN的文档,提高-XX:ThreadStackSize=512的值。

总的来说调优JVM的内存,组要目的就是在使用内存尽可能小的,使程序运行正常,不抛出内纯溢出的bug。而且要调好最小内存,最大内存的比,避免GC时浪费太多时间,尤其是要尽量避免FULL GC。





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

相关推荐

    jvm内存调优.jpg

    jvm内存调优是高级工程师以上岗位的面试中经常会被问到的问题,有一定深度和难度的问题,学习java,如果不知道jvm内存调优,说明肯定是个小菜鸟,小编总结了一些知识点供大家学习与分享

    JVM内存调优深入文章共享

    **JVM内存调优深入解析** Java虚拟机(JVM)内存调优是优化Java应用程序性能的关键环节。本文将从JVM内存结构、垃圾回收算法以及具体的垃圾收集器等方面进行详细探讨,帮助读者理解JVM如何管理和清理内存,以及如何...

    java -jvm 内存分配和jvm调优

    了解这些内存区域后,我们来谈谈JVM内存调优。调优主要包括以下几个方面: 1. 设置合理的堆大小:过大可能导致内存浪费,过小则可能导致频繁的垃圾收集。可以通过-Xms和-Xmx设置初始堆大小和最大堆大小。 2. 年轻...

    JVM内存调优

    在深入探讨JVM内存调优之前,我们需要理解JVM内存模型的基础知识。 JVM内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:每个线程都有一个独立的程序计数器,用于记录当前线程所执行的...

    JVM内存调优.docx

    "JVM内存调优" JVM(Java Virtual Machine)是 Java runtime 环境的核心组件,负责将 Java 字节码转换为机器代码,并管理 Java 程序的执行。JVM 的内存模型主要包括方法区、栈、堆和程序计数器四部分。 方法区...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...

    jvm常用调优方式

    首先,需要注意的是,在对 JVM 内存调优的时候不能只看操作系统级别 Java 进程所占用的内存,因为 GC 过后这个值是不会变化的。因此,在内存调优的时候要更多地使用 JDK 提供的内存查看工具,比如 JConsole 和 Java...

    jvm性能调优+内存模型+虚拟机

    jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    JVM性能调优-JVM内存整理及GC回收.pdf

    在Java编程语言中,方法参数的传递方式是一个重要知识点。Java方法参数的传递分为值传递和引用传递...这些知识点对于准备Java面试的开发者来说,是必须掌握的重要内容,同时也是深入理解JVM内存管理和性能优化的基础。

    JVM性能调优总结.docx

    JVM性能调优总结 JVM性能调优是Java开发中非常重要的一方面,直接影响到系统的性能和稳定性。本文将总结JVM性能调优的经验和技巧,并提供一些实用的配置参数和建议。 一、堆大小设置 堆大小是JVM性能调优中的一个...

    个人总结之—JVM性能调优实战

    - **案例二:大数据处理平台调优**:大数据处理平台往往需要处理海量数据,通过对JVM内存配置、垃圾回收机制等方面的优化,提升数据处理速度。 - **案例三:分布式系统调优**:分布式系统面临着网络延迟、节点通信等...

    JVM内存管理及调优

    ### 三、JVM内存调优 1. **堆大小设置**:通过`-Xms`和`-Xmx`设置初始和最大堆大小,避免频繁调整大小导致的性能波动。 2. **新生代和老年代比例**:通过`-XX:NewRatio`控制新生代和老年代的比例,优化对象晋升策略...

    JVM性能调优-JVM内存整理及GC回收

    《JVM性能调优-JVM内存整理及GC回收》是一份深入探讨Java虚拟机(JVM)优化的重要学习资料,特别适合对JAVA编程有经验的开发者。这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage ...

    JVM 监控 调优 工具

    本文将深入探讨JVM内存结构、监控工具及其在调优和GC优化中的应用。 **JVM内存机构** JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是JVM中最大的一块内存区域,主要用于存储对象实例。堆被进一步...

    006-jvm性能调优

    * JVM内存模型:JDK 1.8中,元数据区取代了永久代,元空间是使用本地内存的。JVM内存模型包括程序计数器、Java虚拟机栈、本地方法栈、Java堆等区域。 JVM参数调优 * JVM参数查看:可以使用java -XX:+...

    第04章 大促高并发系统下JVM如何调优指导03.pdf

    【标题】: "第04章 大促高并发系统下JVM如何调优指导03.pdf" 在大型促销活动期间,高并发系统的性能优化至关重要,尤其是Java虚拟机(JVM)的调优,它直接影响应用程序的响应速度和稳定性。本章节主要探讨了在亿级...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...

    第04章 大促高并发系统下JVM如何调优指导01.pdf

    本文将探讨架构师在面对高并发系统时应该如何进行JVM调优,以及对Java技术体系和JVM内存管理进行深入了解。 首先,架构师在面对系统架构设计时,除了考虑系统的宏观架构外,还需深入到程序底层,考虑JVM的优化。高...

Global site tag (gtag.js) - Google Analytics