JVM 调优 —— OutOfMemory

零. 简介

OutOfMemory 意思就是需要申请更大的内存, 但是内存限制无法申请到需要的内存。

一. 解决方法

基本上解决方向有两种:

  1. 检查程序是否有问题, 是不是写死循环不停地创建并持有对象导致内存不足
  1. 内存确实不够, 分为老年代内存不足和永久代内存不足

(1) 老年代内存不足

看一段 GC 日志:在 Full GC 结束后, 但是老年代占用空间还是接近或者等于老年代最大空间, 说明老年代空间确实分配不够。 调大 -Xms、 -Xmx 并保持新生代大小不变,直到 GC 日志不出现关键字 Exception in thread  “main” java.lang.OutOfMemoryError: Java heap space。

2016-01-19T14:18:19.883+0800: 179.163: [CMS-concurrent-reset-start]
2016-01-19T14:18:19.893+0800: 179.173: [CMS-concurrent-reset: 0.009/0.009 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
{Heap before GC invocations=154 (full 1):
 par new generation   total 943744K, used 850746K [0x0000000757000000, 0x0000000797000000, 0x0000000797000000)
  eden space 838912K, 100% used [0x0000000757000000, 0x000000078a340000, 0x000000078a340000)
  from space 104832K,  11% used [0x000000078a340000, 0x000000078aecea30, 0x00000007909a0000)
  to   space 104832K,   0% used [0x00000007909a0000, 0x00000007909a0000, 0x0000000797000000)
 concurrent mark-sweep generation total 1560576K, used 1560576K [0x0000000797000000, 0x00000007f6400000, 0x00000007f6400000)
 concurrent-mark-sweep perm gen total 159744K, used 69030K [0x00000007f6400000, 0x0000000800000000, 0x0000000800000000)

(2) 永久代内存不足

看一段 GC 日志:在 Full GC 结束后, 但是永久代占用空间还是接近或者等于永久代最大空间, 说明永久代空间确实分配不够。 调大 -XX:PermSize、 -XX:MaxPermSize,直到 GC 日志不出现关键字 Exception in thread  “main” java.lang.OutOfMemoryError: PermGen space。

2016-01-19T14:18:19.883+0800: 179.163: [CMS-concurrent-reset-start]
2016-01-19T14:18:19.893+0800: 179.173: [CMS-concurrent-reset: 0.009/0.009 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
{Heap before GC invocations=154 (full 1):
 par new generation   total 943744K, used 850746K [0x0000000757000000, 0x0000000797000000, 0x0000000797000000)
  eden space 838912K, 100% used [0x0000000757000000, 0x000000078a340000, 0x000000078a340000)
  from space 104832K,  11% used [0x000000078a340000, 0x000000078aecea30, 0x00000007909a0000)
  to   space 104832K,   0% used [0x00000007909a0000, 0x00000007909a0000, 0x0000000797000000)
 concurrent mark-sweep generation total 1560576K, used 345246K [0x0000000797000000, 0x00000007f6400000, 0x00000007f6400000)
 concurrent-mark-sweep perm gen total 159744K, used 159744K [0x00000007f6400000, 0x0000000800000000, 0x0000000800000000)

时间: 2024-11-14 00:08:33

JVM 调优 —— OutOfMemory的相关文章

JVM调优经验分享

前言 一.JVM调优知识背景简介 二.JVM调优参数简介 三.JVM调优目标 四.JVM调优经验 结束语 <br/> 本次分享探讨的JVM调优是指server端运行的JVM调优,适应版本为[1.6– 1.7], 不涉及最新的1.8版本. 假设线程池.连接池.程序代码等都已经做过优化,效果(系统吞吐量.响应性能)仍然不理想,我们就可以考虑JVM调优了. <br/> 一. JVM调优知识背景简介 1.堆与栈的概念 堆和栈是程序运行的关键:栈是运行时的单位,而堆是存储的单位. 栈解决程序

tomcat jvm调优

JVM调优总结 堆(Heap)内存和非堆(Non-heap)内存 堆内存就是Java代码的,留给开发人员使用: 非堆内存是留给JVM自己使用的(方法区.JVM内部处理或优化所需要的内存.每个类结构以及方法和构造方法的代码) Xms:JVM初始内存 默认是物理内存的1/64 Xmx:JVM最大可用内存,默认是物理内存的1/4 Xmn:设置年轻带大小 Xss:设置每个线程的堆栈大小 默认空余堆内存小于40%时,对内存会增大到Xmx的最大值:空余堆内存大于70%时,会减小到Xmx的最小值. 因此,服务

JVM调优浅谈

1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte.short.int.long.char.float.double.boolean.returnAddress 引用类型包括:类类型.接口类型和数组 2.堆与栈 堆和栈是程序运行的关键,很有必要它他们的关系说清楚. 栈是运行时的

JVM调优[转]

JVM调优总结-序 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程.呵呵,所谓的"温故而知新".而真正能走完这个轮回的人,也就能称为大牛或专家了.这个过程可能来来回回,这就是所谓"螺旋上升",而每一次轮回都有新的发现. 这回添加的东西主要集中在基础的一些问题上,还有一些这两年思考的问题.这些问题可能平时我们不会刻意去想,但是真正看清楚了,却发现还是大有裨益的:)希望对大

四:JVM调优与常见异常处理方案

在jvm调优之前,我们必须先了解jvm的内存模型与GC回收机制,这些在我前面的文章里面有介绍!接下来我们通过一个案例来调整jvm性能. 一:调优案例: 1.1 编写demo import java.text.DecimalFormat; /** -XX:+PrintGC    GC回收的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails  显示详细的GC日志 -Xms    堆初始值 -Xmx    堆最大可用值 -XX:SurvivorRati

JVM调优常用参数和注意点备忘录

本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例. gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:backv2_gc_%t.log jinfo可以动态修改java -XX:+PrintFlagsFinal -version|grep manageable这些参数 打印java可配置的非稳定参数:java -XX:+PrintFlagsFinal ,输出的信息中 ":=" 表明了参数被用户或

JVM调优-新生代

JAVA虚拟机新生代,包括eden space+2个survivor空间. 新生代用来存放新近创建的对象,新生代的特点是对象更新速度快,在短时间内产生大量的"死亡对象".对年轻代的垃圾回收称作次级回收 (minor gc) 1.新生代与次级回收 新生代分为三个区域,  一个eden spac , 2个大小相同的survivor,  应用程序只能使用一个eden和一个survivor, 当发生初级垃圾回收的时候,gc挂起程序, 然后将eden和survivorA中的存活对象复制到另外一个

JVM调优

转自:http://blog.csdn.net/chen77716/article/details/5695893 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小. 年轻代(N

Spark性能调优之JVM调优

Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成                2.Spark的调优为什么会和JVM的调优会有关联?--因为Scala也是基于JVM运行的语言                3.Spark中OOM产生的原因                4.如何在JVM这个层面上来对Spark进行调优 补充:                Spark程序运行时--JVM堆内存分配比例 RDD缓存的数据(0.6)    默认 对象_