server 和 client两种模式,如果不配置,JVM会根据应用服务器硬件配置自动选择模式,server模式启动比较慢,但是运行期速度得到了优化,client启动比较快,但是运行期响应没有server模式的优化,适合于个人PC的服务开发和测试。
Garbage Collector Policy:
在Jdk 1.5的时候已经提供了三种GC,除了原来提供的串行GC(SerialGC)以外,还提供了两种新的GC:ParallelGC和ConcMarkSweepGC.ParallelGC采用了多线程并行管理和回收垃圾对象,提高了回收效率,提高了服务器的吞吐量,适合于多处理器的服务器。ConcMarkSweepGC采用的是并发方式来管理和回收垃圾对象,降低垃圾回收产生的响应暂停时间。这里说一下并发和并行的区别,并发指的是多个进程并行执行垃圾回收,那么可以很好的利用多处理器,而并行指的是应用程序不需要暂停可以和垃圾回收线程并发工作。串行GC适合小型应用和单处理器系统(无需多线程交互,效率比较高),后两者适合大型系统。
使用方式就是在参数配置中增加-XX:+UseParallelGC等方式来设置。
对于这部分的配置在网上有很多的实例可以参考,不过最终采用哪一种GC还是要根据具体的情况来分析和选择。
Heap:
OOM的各种经历已经让每一个架构师开发人员看到了了解Heap的重要性。OOM已经是Heap的临界点,不得不引起注意,然而Heap对于性能的潜在影响并未被引起重视,不过和GC配置一样,在没有对使用情况作仔细分析和研究的情况下,贸然的去修改Heap配置,可能适得其反,这里就来看一下Heap的一些概念和对于性能的影响。
我们的应用所能够得到的最大的Heap受三部分因素的制约:数据处理模型(32位或者64位操作系统),系统地虚拟内存总数和系统的物理内存总数。首先Heap的大小不能超过不同操作系统的进程寻址范围,当前大部分系统最高限度是4G,Windows通常是2G,Linux通常是3G.系统的虚拟内存也是分配的依据,首先是不能超过,然后由于操作系统支持硬盘来做部分的虚拟内存,如果设置过大,那么对于应用响应来说势必有影响。再则就是要考虑同一台服务器上运行多个Java虚拟机所消耗的资源总合也不能超过可用资源。就和前面OOM分析中的一样,其实由于OS的数据处理模型的限制,机器本身的硬件内存资源和虚拟内存资源并不一定会匹配,那么在有限的资源下如何调整好资源分配,对于应用来说尤为重要。
关于Heap的几个参数设置:
说了Heap的有限资源问题以后,就来看看如何通过配置去改变JVM对于Heap的分配。下面所说的主要是对于Java Heap的分配,那么在申请了Java Heap以后,剩下的可用资源就会被使用到Native Heap.
Xms: java heap初始化时的大小。默认情况是机器物理内存的1/64.这个主要是根据应用启动时消耗的资源决定,分配少了申请起来会降低启动速度,分配多了也浪费。
Xmx:java heap的最大值,默认是机器物理内存的1/4,最大也就到1G.这个值决定了最多可用的Java Heap Memory,分配过少就会在应用需要大量内存作缓存或者零时对象时出现OOM的问题,如果分配过大,那么就会产生上文提到的第二类OOM.所以如何配置还是根据运行过程中的分析和计算来确定,如果不能确定还是采用默认的配置。
Xmn:java heap新生代的空间大小。在GC模型中,根据对象的生命周期的长短,产生了内存分代的设计:青年代(内部也分成三部分,类似于整体划分的作用,可以通过配置来设置比例),老年代,持久代。每一代的管理和回收策略都不相同,最为活跃的就是青年代,同时这部分的内存分配和管理效率也是最高。通常情况下,对于内存的申请优先在新生代中申请,当内存不够时会整理新生代,当整理以后还是不能满足申请的内存,就会向老年代移动一些生命周期较长的对象。这种整理和移动会消耗资源,同时降低系统运行响应能力,因此如果青年代设置的过小,就会频繁的整理和移动,对性能造成影响。那是否把年青代设置的越大越好,其实不然,年青代采用的是复制搜集算法,这种算法必须停止所有应用程序线程,服务器线程切换时间就会成为应用响应的瓶颈(当然永远不用收集那么就不存在这个问题)。老年代采用的是串行标记收集的方式,并发收集可以减少对于应用的影响。
Xss:线程堆栈最大值。允许更多的虚拟内存空间地址被Java Heap使用。
以下是sun公司的性能优化白皮书中提到的几个例子:
1.对于吞吐量的调优。机器配置:4G的内存,32个线程并发能力。
java
-Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-Xmx3800m -Xms3800m
配置了最大Java Heap来充分利用系统内存。
-Xmn2g
创建足够大的青年代(可以并行被回收)充分利用系统内存,防止将短期对象复制到老年代。
-Xss128
减少默认最大的线程栈大小,提供更多的处理虚拟内存地址空间被进程使用。
-XX:+UseParallelGC
采用并行垃圾收集器对年青代的内存进行收集,提高效率。
-XX:ParallelGCThreads=20
减少垃圾收集线程,默认是和服务器可支持的线程最大并发数相同,往往不需要配置到最大值。
2
.尝试采用对老年代并行收集
java
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-Xmx3550m -Xms3550m
内存分配被减小,因为ParallelOldGC会增加对于Native Heap的需求,因此需要减小Java Heap来满足需求。
-XX:+UseParallelOldGC
采用对于老年代并发收集的策略,可以提高收集效率。
3
.提高吞吐量,减少应用停顿时间
java
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
选择了并发标记交换收集器,它可以并发执行收集操作,降低应用停止时间,同时它也是并行处理模式,可以有效地利用多处理器的系统的多进程处理。
-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=31
表示在青年代中Eden和Survivor比例,设置增加了Survivor的大小,越大的survivor空间可以允许短期对象尽量在年青代消亡。
-XX:TargetSurvivorRatio=90
允许90%的空间被占用,超过默认的50%,提高对于survivor的使用率。
- 浏览: 265522 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
1260533105:
uncaught invalidstateerror:Fail ...
WebSocket -
sh747665463:
压力好大啊
【转】如果你不知道接下去学什么,就看这个
发表评论
-
jvm回顾
2018-11-29 09:10 0一、运行时数据区域 1、程序计数器(program co ... -
转一篇泛型介绍不错的文章
2018-08-02 19:10 637泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛 ... -
jstat
2018-02-04 11:36 426jps(Java Virtual Machine Proce ... -
转:ant 入门
2017-12-09 17:58 6451)什么是Ant ant是构建工具 2)什么是构 ... -
廉颇老矣?n年没写ant,发现生疏了,这不是我想要的
2017-12-09 11:37 595毕业10年,差不多6年没有碰ant了,昨天解决一个siga ... -
jdk 9 hellomodules
2017-10-03 20:45 4671、准备 lib mods src/cn.gbase ... -
转:Java 9,OSGi以及模块化的未来
2017-10-03 19:19 0ava 9,OSGi以及模块化的 ... -
转:Java 9,OSGi以及模块化的未来
2017-10-03 19:12 0<div class="iteye-blog- ... -
转:Java 8 中的 Streams API 详解
2017-10-02 21:39 428Java 8 中的 Streams API 详 ... -
转:装饰模式
2017-01-01 10:46 495一个有意思的装饰模式样例。 Java与模式:装饰(D ... -
转:Java中多态性的实现
2016-08-25 11:10 531Java中多态性的实现 什么是多态 面向对象的三大 ... -
深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
2016-01-22 14:35 2652作者:Lucida 微博:@peng_gong 豆瓣 ... -
转:permGen space out of memory
2013-11-21 12:53 1012PermGen space的全称是Permanent Gen ... -
trove high performance collections for java
2013-06-02 10:31 694trove high performance collec ... -
kettle Could not find the main class. Program will exit err
2013-06-01 15:44 0I am new in KETTLE. I am tryi ... -
jvm参数集合
2013-05-26 15:42 678一、内存分配 -xms java heap初始化时的大小 ... -
http 错误代码
2013-04-25 09:00 670HTTP 400 – 请求无效HTTP 401.1 – 未授 ... -
JDBC 规范4.1 翻译 (一)
2012-12-28 14:41 23从今天开始希望每天抽出来一点时间把JDBC规范4. ... -
jconsole配置远程监控
2012-11-29 16:59 1637java -Djava.rmi.server. ... -
jconsole不能连接本地进程
2012-11-29 16:56 7549现象: 1.运行jconsole时,本地进程里没有出现jav ...
相关推荐
**JVM性能优化** 在Java开发中,JVM(Java Virtual Machine)是至关重要的组成部分,它负责运行所有的Java应用程序。JVM性能优化是一项细致而关键的任务,能够显著提升程序的运行效率,减少资源消耗,提高系统稳定...
在Java开发中,Java虚拟机(JVM)是...4. SpringBoot应用中的JVM优化配置。 5. 使用监控工具进行性能分析和故障排查。 通过这个项目,开发者可以深入理解JVM的工作原理,并掌握如何在实践中优化Java应用程序的性能。
### JVM内存配置优化 #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组...
"jvm优化参数配置"是确保Tomcat稳定运行的关键环节,能够提高应用的响应速度,减少内存泄露,提升系统整体性能。以下是对JVM参数优化的详细解释: 1. **内存配置**: - **堆内存(Heap Memory)**:分为新生代...
Java Virtual Machine (JVM) 是运行Java程序的核心环境,其性能优化很大程度上依赖于正确的JVM参数配置。合理配置JVM参数不仅可以显著提升应用程序的运行效率,还能避免因内存溢出等问题导致的系统崩溃。本文将深入...
1.什么是编程语言。 编程思想比编程语言更加重要 2.为什么要进行性能优化。 3.性能优化的瓶颈 ...JVM优化配置 Tomcat优化配置 4。数据库优化 1.减少数据访问 索引 sql的执行计划 2.减少返回的数据 分页
在JVM优化中,内存配置是关键的一环。例如,`-Xms2048m -Xmx2048m`设置了JVM的最小和最大堆内存为2GB,`-Xmn512m`指定了新生代的大小为512MB,`-XX:MaxPermSize=256m`设定了永久代的最大值为256MB,而`-Xss128k`则...
为了深入理解JVM优化的相关知识点,我们可以从多个角度来探讨。首先,需要理解JVM(Java虚拟机)的基本概念,以及在性能调优中的关键作用。JVM是运行Java程序的核心组件,负责解释Java字节码,并将字节码转换成特定...
在优化方面,JVM配置参数起着决定性作用。例如,“-Xms”和“-Xmx”用于设置堆内存的初始大小和最大大小,合理设置可避免内存溢出;“-XX:NewRatio”控制年轻代与老年代的比例,影响垃圾收集频率;“-XX:...
JVM优化详解涉及的是Java虚拟机(Java Virtual Machine)的性能调优,这是Java应用性能提升的一个重要方面。JVM是运行Java字节码的抽象计算机,其性能优化对于提高Java应用程序的执行效率至关重要。下面我们来详细...
本篇文件内容主要介绍了JVM优化的第三部分,重点围绕Tomcat参数调优、JVM参数调优、JVM字节码优化以及代码优化等几个方面。下面是针对这些知识点的详细解释: 1. Tomcat参数调优 在Tomcat参数调优部分,首先介绍了...
以下是对JVM部分关键配置参数的详细解析,这些参数能够帮助我们优化应用程序的执行效率,管理内存,以及进行性能调优。 #### 执行模式配置 1. **-Xmixed**: 混合模式执行(默认)。此参数指示JVM使用混合模式执行...
JVM参数配置是优化的关键,主要包括以下几个参数: -XX:MaxPermSize=256m:设置持久代(PermGen)的大小为256MB,持久代用于存储类的元数据。 -Xms和-Xmx:分别设置JVM启动时的初始堆大小和最大堆大小。为了提升性能...
综上所述,TongWeb5.0性能优化配置涉及到了JNDI配置、JVM参数调整、日志参数设置和线程数管理等多个方面。这些优化工作不仅需要对TongWeb的内部结构和工作机制有深刻的理解,还需要根据实际运行环境和业务需求进行...
3. JVM调优:JVM调优通常指对JVM进行配置,优化性能以应对特定的应用需求。常见的调优手段包括调整堆内存大小、设置垃圾回收器(GC)、调整线程堆栈大小、选择合适的垃圾回收策略和参数等。 4. JAVA并发:Java并发...
【JVM优化】Java的JVM优化涉及到许多关键知识点,主要目标是确保应用程序在生产环境中稳定、高效地运行。在本地开发环境中,由于资源限制不严,通常不需要过多关注JVM优化,但在生产环境中,面临如应用卡死、日志无...
文档"深入Java虚拟机(原书第2版).pdf"将为你提供更深入的理论基础,"jvm优化.docx"涵盖了具体的JVM调优技巧,而"tomcat性能调优.docx"则专注于Tomcat的优化实践。通过学习这些资料,你将能够更好地理解和优化你的...
【JVM参数配置详解】 Java Virtual Machine (JVM) 是Java程序的核心组成部分,它负责解析和执行Java程序的字节码。JVM的设计目标是提供跨平台的运行环境,通过在实际硬件上模拟一个虚拟的计算机系统,使得Java程序...