最近系统偶尔抛出错误:
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
于是简单研究了一下内存的配置。
-XX:PermSize=64m -XX:MaxPermSize=64m
这个是非堆内存配置,初始与最大。64兆系统启动没有问题,如果设置为32兆,则会报错:
java.lang.OutOfMemoryError: PermGen space,并且系统启动失败。
-XX:PermSize=64m -XX:MaxPermSize=32m
不要以为最大设为32就可以控制非堆为32兆,实践证明这样还是以64兆初始的,启动成功。
非堆主要用于反射等,所以不用太大,够用就行。
-Xms128m -Xmx128m
这个是堆,也就是heap。要设置大一些。一般初始和最大设为一样,减少变化时的开销。
如果设置过小,比如32m,也是可以启动成功,也可以访问页面,但是会输出日志:
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor3]
有generation机制。heap分为young和old。
-Xmn是控制young的。一般分配四分之一。
-Xmn32m
所以,很自然的,Xmx-Xmn就是old。当jvm有一个线程,会在不足时把young升级为old的。
网上说Xmx不要超过物理内存,否则会报错:
“Error occurred during initialization of VM Could not reserve enough space for object heap”
也就是说本文第一句的系统报错不是别的应用占用了内存导致,而是本身分配给应用的内存不够导致。
系统组跟我说杀掉其他应用就解决了这个说法是错误的。
同时,网上说web应用的heap值可以比gui的大。也就是说heap与吞吐量有关。
可以增加日志观察GC的情况:
-XX:+PrintGCDetails -Xloggc:d:\gc.log
+号是开,-号是关。
看gc.log文件:
3.784: [GC 3.784: [DefNew: 26240K->3264K(29504K), 0.0409710 secs] 26240K->3677K(521024K), 0.0411614 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
15.576: [Full GC 15.576: [Tenured: 0K->12588K(349568K), 0.3585221 secs] 70393K->12588K(506816K), [Perm : 36863K->36863K(36864K)], 0.3587096 secs] [Times: user=0.31 sys=0.03, real=0.36 secs]
DefNew是young,Tenured是old。
young里存活久的对象会自动移到old。old里回收并不频繁。
同样一个操作,如果Xms过小,jvm需要频繁的回收对象,log日志就会很多;
相反,Xms设置大,log日志会少很多。
如果PermSize设置大,DefNew会多,Tenured少。比如
-XX:PermSize=64m -XX:MaxPermSize=64m
基本没有Tenured。
Minor收集young,Major收集old,
-XX:+UseParNewGC调节Minor,-XX:+UseConcMarkSweepGC调节Major,没时间尝试,先不管。
解决方案:
1 增加gc.log日志
2 调大Xms和Xmx为4G试试,现在是2G
============
2013.7.19
增加一种方案:增加选项:-XX:-UseGCOverheadLimit
if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown.
分享到:
相关推荐
### 关于Java内存泄漏 #### 一、Java内存管理机制 Java的一大特色在于其自动化的内存管理机制,这主要依赖于垃圾收集器(Garbage Collection, GC)来自动完成对象的内存分配与回收。尽管这一特性极大地减轻了...
以下是一些关于Java内存泄漏的注意事项和相关知识点: 1. **理解可达性和无用性**:内存泄漏在Java中发生时,通常是由于某些对象尽管不再使用,但仍然可以通过对象引用图到达,这使得垃圾收集器无法识别它们为无用...
### 关于Java内存泄露问题解决 #### 引言:Java内存管理的核心——垃圾回收机制(GC) Java作为当今产业界和学术界最炙手可热的编程语言之一,以其独特的安全性和可移植性赢得了广泛的应用,尤其是在服务器端编程...
主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。
什么是内存泄漏?造成内存泄漏的原因?如何解决内存泄漏?以及如何避免内存泄漏等。。。
以下是关于Java内存分配的一些核心知识点: 1. **Java内存区域**:Java内存分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。其中,堆和栈是...
eclipse设置java内存 Eclipse是一个功能强大且广泛使用的集成开发环境(IDE),但是,如果不正确地设置其运行内存,可能会导致内存溢出错误。因此,正确地设置Eclipse的java内存是非常重要的。本文将详细介绍如何...
关于这一规范的讨论和开发的档案,可以在Java内存模型的网站上找到,该网站提供了额外的信息,有助于理解该规范是如何制定的。 理解Java内存模型的具体实现,对于程序员来说是一个挑战,但也是一个重要的技能。因为...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
java 内存模型 java 内存模型 java 内存模型 java 内存模型
以下是关于Java内存泄露的一些关键知识点和分析方法: 1. **内存泄露定义**: 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能不明显,但随着时间推移,内存消耗持续增长,最终...
Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...
"mmr.rar_java内存_mmr"这个压缩包显然包含了关于Java内存管理的资料,特别是与“MMR”(可能是“Memory Management Region”或者某种特定的内存管理策略的缩写)相关的知识。描述中提到的“三个包”可能是指源代码...
Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...
Java 内存原理 Java 内存原理是 Java 语言中的一种基本机制,用于管理和分配内存资源。在 Java 中,内存被分为两种:栈内存和堆内存。 栈内存是指在函数中定义的一些基本类型的变量和对象的引用变量。这些变量在...
JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控
本篇文章将详细探讨jProfiler7在Java内存分析上的核心功能、使用方法以及在Linux环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...