一个性能较好的web服务器jvm参数配置:
-server //服务器模式 -Xmx2g //JVM最大允许分配的堆内存,按需分配 -Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JVM重新分配内存。 -Xmn256m //年轻代内存大小,整个JVM内存=年轻代 + 年老代 + 持久代 -XX:PermSize=128m //持久代内存大小 -Xss256k //设置每个线程的堆栈大小 -XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,完全不触发GC -XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器 -XX:+CMSParallelRemarkEnabled //降低标记停顿 -XX:+UseCMSCompactAtFullCollection //在FULL GC的时候对年老代的压缩 -XX:LargePageSizeInBytes=128m //内存页的大小 -XX:+UseFastAccessorMethods //原始类型的快速优化 -XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义开始CMS收集 -XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后开始CMS收集
说明:
-Xmn和-Xmx之比大概是1:9,如果把新生代内存设置得太大会导致young gc时间较长
一个好的Web系统应该是每次http请求申请内存都能在young gc回收掉,full gc永不发生,当然这是最理想的情况
xmn的值应该是保证够用(够http并发请求之用)的前提下设置得尽量小
web服务器和游戏服务器的配置思路不太一样,最重要的区别是对游戏服务器的xmn即年轻代设置比较大,和Xmx大概1:3的关系,因为游戏服务器一般是长连接,在保持一定的并发量后需要较大的年轻代堆内存,如果设置得大小了会经常引发young gc
- 对JVM的简介
由上图可以看出jvm堆内存的分类情况,JVM内存被分成多个独立的部分。
广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation)。
- 年轻代
年轻代是所有新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做Minor GC。年轻代被分为3个部分——Enden区和两个Survivor区。
年轻代空间的要点:
大多数新建的对象都位于Eden区。
当Eden区被对象填满时,就会执行Minor GC。并把所有存活下来的对象转移到其中一个survivor区。
Minor GC同样会检查存活下来的对象,并把它们转移到另一个survivor区。这样在一段时间内,总会有一个空的survivor区。
经过多次GC周期后,仍然存活下来的对象会被转移到年老代内存空间。通常这是在年轻代有资格提升到年老代前通过设定年龄阈值来完成的。
- 年老代
年老代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象。通常会在老年代内存被占满时进行垃圾回收。老年代的垃圾收集叫做Major GC。Major GC会花费更多的时间。
Stop the World事件
所有的垃圾收集都是“Stop the World”事件,因为所有的应用线程都会停下来直到操作完成(所以叫“Stop the World”)。
因为年轻代里的对象都是一些临时(short-lived )对象,执行Minor GC非常快,所以应用不会受到(“Stop the World”)影响。
由于Major GC会检查所有存活的对象,因此会花费更长的时间。应该尽量减少Major GC。因为Major GC会在垃圾回收期间让你的应用反应迟钝,所以如果你有一个需要快速响应的应用发生多次Major GC,你会看到超时错误。
垃圾回收时间取决于垃圾回收策略。这就是为什么有必要去监控垃圾收集和对垃圾收集进行调优。从而避免要求快速响应的应用出现超时错误。
- 永久代
永久代或者“Perm Gen”包含了JVM需要的应用元数据,这些元数据描述了在应用里使用的类和方法。注意,永久代不是Java堆内存的一部分。
永久代存放JVM运行时使用的类。永久代同样包含了Java SE库的类和方法。永久代的对象在full GC时进行垃圾收集。
方法区
方法区是永久代空间的一部分,并用来存储类型信息(运行时常量和静态变量)和方法代码和构造函数代码。
内存池
如果JVM实现支持,JVM内存管理会为创建内存池,用来为不变对象创建对象池。字符串池就是内存池类型的一个很好的例子。内存池可以属于堆或者永久代,这取决于JVM内存管理的实现。
运行时常量池
运行时常量池是每个类常量池的运行时代表。它包含了类的运行时常量和静态方法。运行时常量池是方法区的一部分。
Java栈内存
Java栈内存用于运行线程。它们包含了方法里的临时数据、堆里其它对象引用的特定数据。
Java垃圾回收
Java垃圾回收会找出没用的对象,把它从内存中移除并释放出内存给以后创建的对象使用。Java程序语言中的一个最大优点是自动垃圾回收,不像其他的程序语言那样需要手动分配和释放内存,比如C语言。
垃圾收集器是一个后台运行程序。它管理着内存中的所有对象并找出没被引用的对象。所有的这些未引用的对象都会被删除,回收它们的空间并分配给其他对象。
一个基本的垃圾回收过程涉及三个步骤:
标记:这是第一步。在这一步,垃圾收集器会找出哪些对象正在使用和哪些对象不在使用。
正常清除:垃圾收集器清会除不在使用的对象,回收它们的空间分配给其他对象。
压缩清除:为了提升性能,压缩清除会在删除没用的对象后,把所有存活的对象移到一起。这样可以提高分配新对象的效率。
简单标记和清除方法存在两个问题:
效率很低。因为大多数新建对象都会成为“没用对象”。
经过多次垃圾回收周期的对象很有可能在以后的周期也会存活下来。
上面简单清除方法的问题在于Java垃圾收集的分代回收的,而且在堆内存里有年轻代和年老代两个区域。
- Java垃圾回收类型
这里有五种可以在应用里使用的垃圾回收类型。
仅需要使用JVM开关就可以在我们的应用里启用垃圾回收策略。
Serial GC(-XX:+UseSerialGC):Serial GC使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客户端模式)很有用,比如在简单的独立应用和CPU配置较低的机器。这个模式对占有内存较少的应用很管用。
Parallel GC(-XX:+UseParallelGC):除了会产生N个线程来进行年轻代的垃圾收集外,Parallel GC和Serial GC几乎一样。这里的N是系统CPU的核数。我们可以使用 -XX:ParallelGCThreads=n 这个JVM选项来控制线程数量。并行垃圾收集器也叫throughput收集器。因为它使用了多CPU加快垃圾回收性能。Parallel GC在进行年老代垃圾收集时使用单线程。
Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC一样。不同之处,Parallel Old GC在年轻代垃圾收集和年老代垃圾回收时都使用多线程收集。
并发标记清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。可使用 -XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。
G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才可以使用的特性,它的长远目标时代替CMS收集器。G1收集器是一个并行的、并发的和增量式压缩短暂停顿的垃圾收集器。G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域,因此叫“Garbage First”。
相关推荐
#### 如何获取JVM参数配置信息 可以通过命令行方式获取JVM的所有参数配置信息。例如,在Windows平台上,通过`cmd`进入`J2SDK`安装目录下的`bin`目录,运行以下命令: ```batch java -X ``` 这会显示包括`java.exe...
Java虚拟机(JVM)是执行Java字节码的软件环境,为了提高Java程序的性能和稳定性,合理调整JVM的内存参数至关重要。根据Java启动参数的不同分类,我们可以将其分为标准参数(-)、非标准参数(-X)以及非稳定参数(-XX...
这份"JVM配置资料"包含的可能是一系列关于优化JVM性能、理解和调试JVM行为的重要信息。下面将详细讨论JVM配置中的关键知识点。 1. **JVM内存模型**: - **堆内存(Heap Memory)**:分为新生代(Young Generation...
Tomcat性能优化是指通过调整Tomcat服务器的配置和JVM的参数,以提高Tomcat服务器的性能和响应速度。Tomcat性能优化主要包括代码层优化、JVM内存优化和应用配置优化三方面。 代码层优化是指通过优化Java代码,减少...
综上所述,JVM性能调优涉及多个方面,包括理解参数传递机制、掌握不同类型的引用以及深入了解垃圾回收算法和分区处理方式等。通过合理配置和调整这些机制,可以显著提高Java应用程序的性能和稳定性。开发者应根据...
在eclipse.ini文件中设置JVM参数无效的原因可能是因为没有遵循文件的格式规范。参数应以"项值"的形式出现,如果有空格,需换行书写,值中若有空格,应使用双引号括起来。例如: ``` -vm "C:\Java\jre1.6.0\bin\...
在过去,CMS (Concurrent Mark-Sweep) 垃圾回收器在Java 8中是一种常见选择,因为它在某些场景下能够提供较好的性能。 然而,随着Java版本的不断更新,一些旧的特性和组件被淘汰或替代,比如CMS。Java 14中正式废弃...
本文档深入探讨了Java 6 (JDK 6) 的JVM参数配置,旨在为开发者提供一份详尽的指南,帮助理解并合理设置JVM参数以优化Java应用程序的性能。本文档基于最新的SUN官方文档编写,并针对非稳态选项进行了重点介绍。 ####...
Java虚拟机(JVM)是运行Java程序的一种环境,它为Java应用程序提供了一个独立于硬件的抽象计算机模型。通过JVM,开发者可以将编写的Java程序部署在各种不同的操作系统上而无需修改源代码,极大地提高了跨平台性。 ...
为了更好地控制Java虚拟机的行为,可以设置一系列JVM参数来优化性能。这些参数可以分为几类: - **标准参数**:所有JVM实现都支持的标准配置选项。 - **非标参数(-X)**:某些特定JVM实现提供的扩展配置选项。 - *...
JVM启动参数的正确配置对于优化应用程序性能、控制内存使用、诊断问题和调试至关重要。本篇文章将详细介绍JVM的一些标准启动参数,以帮助开发者更好地理解和应用它们。 1. **-client与-server** `-client` 和 `-...
为了更好地理解和优化JVM的运行状态,开发人员需要掌握一系列的监控工具和技术。本文将详细介绍JDK自带的一些强大的JVM监控工具,包括jconsole、jvisualvm以及Oracle JRockit Mission Control (JRMc),并指导如何...
### JVM原理、内存模型、性能调优 #### 一、JVM原理概述 Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个独立于平台的运行环境,并且能够自动处理内存管理和垃圾回收等工作。JVM的核心...
总结来说,理解并掌握IntelliJ IDEA的JVM参数配置是每个Java开发者进阶的必经之路,这不仅可以使开发环境运行更加顺畅,还有助于提升个人的技能水平。通过持续学习和实践,我们可以在日常工作中更好地驾驭这强大的...
同时,了解如何正确配置JVM以生成详细的GC日志也是至关重要的,这通常涉及到设置JVM启动参数,如`-XX:+PrintGCDetails`和`-XX:+PrintGCDateStamps`。 最后,"ga441"可能是指一个具体的工具版本或者一个特定的日志...
标题 "ECLIPSE,TOMCAT,JVM内存设置" 涉及到的是在开发Java Web应用程序时,如何配置Eclipse集成开发环境(IDE)、Apache Tomcat服务器以及Java虚拟机(JVM)的内存参数,以优化性能和避免内存溢出等问题。...
3. 栈内存:每个线程都有一个独立的栈,用于存储方法调用时的局部变量、操作数栈、动态链接及方法出口等信息。栈帧随着方法的调用和返回而创建和销毁。 4. 本地方法栈:与Java方法栈类似,但服务于Java虚拟机的本地...