基本概念:
PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域
Heap space:存放Instance。GC(Garbage Collection)应该不会对PermGen space进行清理
所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误
Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象。
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%的剩余空间。
建议Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。
增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
Stack的设定
每个线程都有他自己的Stack。
-Xss 每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就会导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。
4种GC
1、第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
JVM参数配置
1: heap size
a: -Xmx<n>
指定 jvm 的最大 heap 大小 , 如 :-Xmx=2g
b: -Xms<n>
指定 jvm 的最小 heap 大小 , 如 :-Xms=2g , 高并发应用, 建议和-Xmx一样, 防止因为内存收缩/突然增大带来的性能影响。
c: -Xmn<n>
指定 jvm 中 New Generation 的大小 , 如 :-Xmn256m。 这个参数很影响性能, 如果你的程序需要比较多的临时内存, 建议设置到512M, 如果用的少, 尽量降低这个数值, 一般来说128/256足以使用了。
d: -XX:PermSize=<n>
指定 jvm 中 Perm Generation 的最小值 , 如 :-XX:PermSize=32m。 这个参数需要看你的实际情况,。 可以通过jmap 命令看看到底需要多少。
e: -XX:MaxPermSize=<n>
指定 Perm Generation 的最大值 , 如 :-XX:MaxPermSize=64m
f: -Xss<n>
指定线程桟大小 , 如 :-Xss128k, 一般来说,webx框架下的应用需要256K。 如果你的程序有大规模的递归行为,请考虑设置到512K/1M。 这个需要全面的测试才能知道。 不过,256K已经很大了。 这个参数对性能的影响比较大的。
g: -XX:NewRatio=<n>
指定 jvm 中 Old Generation heap size 与 New Generation 的比例 , 在使用 CMS GC 的情况下此参数失效 , 如 :-XX:NewRatio=2
h: -XX:SurvivorRatio=<n>
指 定 New Generation 中 Eden Space 与一个 Survivor Space 的 heap size 比例 ,-XX:SurvivorRatio=8, 那么在总共 New Generation 为 10m 的情况下 ,Eden Space 为 8m
i: -XX:MinHeapFreeRatio=<n>
指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如 :-XX:MinHeapFreeRatio=30
j: -XX:MaxHeapFreeRatio=<n>
指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如 :-XX:MaxHeapFreeRatio=70
k: -XX:LargePageSizeInBytes=<n>
指定 Java heap 的分页页面大小 , 如 :-XX:LargePageSizeInBytes=128m
2: garbage collector
a: -XX:+UseParallelGC
指 定在 New Generation 使用 parallel collector, 并行收集 , 暂停 app threads, 同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用 . 系统吨吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc
b: -XX:ParallelGCThreads=<n>
指定 parallel collection 时启动的 thread 个数 , 默认是物理 processor 的个数 ,
c: -XX:+UseParallelOldGC
指定在 Old Generation 使用 parallel collector
d: -XX:+UseParNewGC
指定在 New Generation 使用 parallel collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能或者优点 , 可以和 CMS gc 一起使用
e: -XX:+CMSParallelRemarkEnabled
在使用 UseParNewGC 的情况下 , 尽量减少 mark 的时间
f: -XX:+UseConcMarkSweepGC
指 定在 Old Generation 使用 concurrent cmark sweep gc,gc thread 和 app thread 并行 ( 在 init-mark 和 remark 时 pause app thread). app pause 时间较短 , 适合交互性强的系统 , 如 web server
g: -XX:+UseCMSCompactAtFullCollection
在使用 concurrent gc 的情况下 , 防止 memory fragmention, 对 live object 进行整理 , 使 memory 碎片减少
h: -XX:CMSInitiatingOccupancyFraction=<n>
指示在 old generation 在使用了 n% 的比例后 , 启动 concurrent collector, 默认值是 68, 如 :-XX:CMSInitiatingOccupancyFraction=70
i: -XX:+UseCMSInitiatingOccupancyOnly
指示只有在 old generation 在使用了初始化的比例后 concurrent collector 启动收集
3:others
a: -XX:MaxTenuringThreshold=<n>
指 定一个 object 在经历了 n 次 young gc 后转移到 old generation 区 , 在 linux64 的 java6 下默认值是 15, 此参数对于 throughput collector 无效 , 如 :-XX:MaxTenuringThreshold=31
b: -XX:+DisableExplicitGC
禁止 java 程序中的 full gc, 如 System.gc() 的调用. 最好加上么, 防止程序在代码里误用了。对性能造成冲击。
c: -XX:+UseFastAccessorMethods
get,set 方法转成本地代码
d: -XX:+PrintGCDetails
打应垃圾收集的情况如 :
[GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]
e: -XX:+PrintGCTimeStamps
打应垃圾收集的时间情况 , 如 :
[Times: user=0.09 sys=0.00, real=0.02 secs]
f: -XX:+PrintGCApplicationStoppedTime
打应垃圾收集时 , 系统的停顿时间 , 如 :
Total time for which application threads were stopped: 0.0225920 seconds
JVM参数设置大全
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
JVM参数设置大全压缩版
http://blogs.sun.com/watt/resource/jvm-options-list.html
- 浏览: 576010 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (237)
- Java (48)
- Flex3 (43)
- Spring (7)
- Hibernate (7)
- 杂文 (2)
- 设计模式 (3)
- 数据库相关 (32)
- Eclipse开发环境 (10)
- C/C++ (1)
- 随笔 (1)
- 生活点滴 (2)
- Flex4 (3)
- Oracle (6)
- SQLServer (6)
- Degrafa (1)
- ActionScript (2)
- JavaScript (11)
- MySQL (8)
- 开源项目 (4)
- AspectJ (0)
- Spring Security (1)
- SSO (0)
- PV3D (2)
- JBPM (1)
- JBoss (0)
- Tomcat (5)
- Struts (1)
- WebService (2)
- 算法 (1)
- 数据结构 (1)
- POI (2)
- Lucene (2)
- 其他 (3)
- Blazeds (2)
- Alternative 3D (0)
- Ibatis (3)
- Intellij (3)
- freemaker (0)
- Maven (5)
- web (4)
- Eclipse (1)
- velocity (1)
- Linux (7)
- CXF (3)
- html (2)
- JVM (1)
最新评论
-
jpsb:
多谢楼主,问题解决,主要就是svn版本不同导致的
Eclipse 导入本地svn项目的问题 -
yycdaizi:
lanmolsz 写道无法同意楼主的说法,楼主所谓的晚捕捉就是 ...
Java异常处理原则 -
lanmolsz:
无法同意楼主的说法,楼主所谓的晚捕捉就是典型的让异常控制程序的 ...
Java异常处理原则 -
cici_new_1987:
...
Java异常处理原则 -
雁行:
倒是怀疑这个功能来着
Eclipse 导入本地svn项目的问题
发表评论
-
【转载】8张图理解Java
2015-12-23 13:44 849一图胜千言,下面图解均来自Program Creek 网站 ... -
【转载】JAVA多线程与并发学习总结
2015-12-17 13:23 966本文转载自:http://www.cnblogs.co ... -
关于MAT分析工具中的Shallow heap & Retained heap
2015-11-26 10:58 1381本文转载自:http://bjyzxxds.iteye.c ... -
触发JVM进行Full GC的情况及应对策略
2015-11-10 14:10 3196转载自:http://blog.csdn.net/chen ... -
[转载]在线数据迁移经验:如何为正在飞行的飞机更换引擎
2015-02-25 15:49 911转载自:http://www.infoq.c ... -
java.lang.OutOfMemoryError: unable to create new native thread问题诊断
2014-10-27 18:34 611转载自:http://www.blogjava.net/l ... -
JVM调优总结 -Xms -Xmx -Xmn -Xss
2014-10-14 09:28 817本文转载自:http://unixboy.iteye.co ... -
JVM参数分析
2014-01-26 19:54 1154转载自: http:// ... -
Java的getByte()方法解析
2014-01-17 13:28 1497转载自: http://bijian1013. ... -
httpClient处理乱码
2014-01-10 12:08 793利用HttpClient模拟Http请求访问页面 ... -
Tomcat 生产服务器性能优化
2013-11-13 19:45 893转载自:http://www.oschina.net/tra ... -
JVM内存配置
2013-07-11 09:34 1284原文地址:http://vanadiu ... -
Jackson序列化和反序列化
2013-04-29 16:29 2240Jackson使用备忘 Jackson主要使用 ... -
Mysql连接异常
2013-04-29 15:47 1103在连接Mysql数据库后,查询时报错: The l ... -
浅谈SQL Server中的快照
2012-12-31 09:32 1202简介 数据库快照,正如其名称所示那样,是数据库在 ... -
使用IBM heapAnalyzer分析heap dump文件步骤
2012-12-18 21:38 298731. ... -
Spring防止重复ID命名
2012-08-17 16:34 12051、同一个spring配置文件不允许重复ID,这个不需要 ... -
Java异常处理原则
2012-02-21 16:36 8780关于异常处理的一篇文章 异常处理机制 ... -
Intellij常用快捷键收集
2012-01-04 15:22 1102Alt+回车 导入包,自动修正 Ctrl+N 查 ... -
CXF生成.NET的webService客户端无法传值
2011-12-08 18:07 1673在cmd下利用wsdl2java命令生成.NET的 ...
相关推荐
《JVM、GC详解及调优》是一份深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的详细资料。本文将根据提供的信息,深入阐述JVM的工作原理,GC的机制以及如何进行JVM的性能调优。 首先,JVM是...
合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理机制的理解,结合具体的应用场景,开发者可以有效地避免内存溢出错误,确保应用稳定高效地运行。希望本文能为您的Java项目提供有力的...
5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...
### JVM内存参数调优详解 #### 一、概述 Java虚拟机(JVM)是执行Java字节码的软件环境,为了提高Java程序的性能和稳定性,合理调整JVM的内存参数至关重要。根据Java启动参数的不同分类,我们可以将其分为标准参数...
### JVM内存参数调优 在Java开发过程中,合理地配置JVM(Java虚拟机)的内存参数对于提高程序运行效率、避免内存溢出等问题至关重要。本文将深入探讨JVM内存参数调优的相关知识点,帮助开发者更好地理解并掌握如何...
#### 二、JVM内存模型详解 JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java ...
1. **内存管理**:JVM内存分为堆内存和栈内存,其中堆内存又分为新生代、老年代和永久代(Java 8后改为元空间)。合理的设置各区域大小,如新生代与老年代的比例,可以有效避免垃圾收集频繁触发,提高应用响应速度。...
1. **内存模型**:JVM内存分为堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。其中,堆和方法区是线程共享的,而栈和程序计数器是...
### JVM详解及调优 #### 一、JVM概述与工作原理 **1.1 Java定义** Java是一种广泛使用的高级编程语言,具有平台无关性、安全性高、面向对象等特点。Java程序可以在安装了Java虚拟机(JVM)的任何平台上运行。 **...
本篇文档详细介绍了JVM调优工具的命令使用及其相关知识点,涵盖了内存信息分析、死锁检测、JMX远程监控等方面的命令行工具的使用方法。 首先,文档提到了JPS命令,它用于查看当前运行的Java进程信息,并返回进程ID...
JVM内存模型包括堆内存、方法区、虚拟机栈、本地方法栈以及程序计数器等多个区域,而JVM性能调优则涉及这些区域的配置和优化。在众多的JVM调优工具中,`jstat`(Java Virtual Machine Statistics Monitoring Tool)...
一、JVM参数详解 JVM参数可以分为三类:启动参数(-X),标准参数(-XX),以及非公开(实验性)参数(-XX:)。这些参数允许开发者对JVM的行为进行精细调整,以适应特定应用的需求。 1. 启动参数(-X) - `-Xms` ...
**JVM参数调优详解** Java虚拟机(JVM)是Java程序运行的基础,它负责解析字节码并执行程序。然而,为了实现最佳性能,开发者需要对JVM进行调优,确保应用程序能够高效、稳定地运行。"JVM参数参数调优共11页.pdf....
### JVM性能调优——JVM内存管理与GC回收详解 #### 概览 在现代软件开发领域,Java凭借其强大的跨平台能力和丰富的生态系统成为企业级应用的首选语言之一。然而,随着应用程序复杂度的提高以及业务需求的变化,...
### JVM调优详解 #### 前言 Java虚拟机(JVM)作为Java程序的运行环境,其性能直接影响着应用程序的响应时间和资源消耗。合理的JVM调优不仅可以提升程序的运行效率,还能优化用户体验。本文将详细介绍几种常用的垃圾...
### 常用JVM配置参数详解 #### 一、概述 Java虚拟机(JVM)是运行Java程序的核心环境,其性能的优劣直接影响到Java应用程序的执行效率。为了更好地控制JVM的行为并进行调优,熟悉JVM的配置参数至关重要。本文将深入...
JVM是一个运行Java字节码的虚拟计算机,它负责类加载、内存管理、垃圾回收以及执行字节码。其中,内存管理是调优的重点,主要包括堆内存(Heap)、方法区(Method Area)、栈内存(Stack)、本地方法栈(Native ...
### JVM调优详解 #### 一、JVM调优概述 在现代软件开发中,Java虚拟机(JVM)作为Java应用程序的运行环境,对于提高应用程序的性能至关重要。JVM调优是指通过调整JVM的各种参数来优化Java应用程序的运行效率,减少...
以下是对JVM部分关键配置参数的详细解析,这些参数能够帮助我们优化应用程序的执行效率,管理内存,以及进行性能调优。 #### 执行模式配置 1. **-Xmixed**: 混合模式执行(默认)。此参数指示JVM使用混合模式执行...