Java Hotspot Mode: server 和 client两种模式如果不配置JVM会根据应用服务器硬件配置自动选择模式server模式启动比较慢但是运行期速度得到了优化client启动比较快但是运行期响应没有server模式的优化适合于个人PC的服务开发和测试 Garbage Collector Policy: 在Jdk 的时候已经提供了三种GC除了原来提供的串行GC(SerialGC)以外还提供了两种新的GC:ParallelGC和ConcMarkSweepGCParallelGC采用了多线程并行管理和回收垃圾对象提高了回收效率提高了服务器的吞吐量适合于多处理器的服务器ConcMarkSweepGC采用的是并发方式来管理和回收垃圾对象降低垃圾回收产生的响应暂停时间这里说一下并发和并行的区别并发指的是多个进程并行执行垃圾回收那么可以很好的利用多处理器而并行指的是应用程序不需要暂停可以和垃圾回收线程并发工作串行GC适合小型应用和单处理器系统(无需多线程交互效率比较高)后两者适合大型系统 使用方式就是在参数配置中增加XX:+UseParallelGC等方式来设置 对于这部分的配置在网上有很多的实例可以参考不过最终采用哪一种GC还是要根据具体的情况来分析和选择 Heap: OOM的各种经历已经让每一个架构师开发人员看到了了解Heap的重要性OOM已经是Heap的临界点不得不引起注意然而Heap对于性能的潜在影响并未被引起重视不过和GC配置一样在没有对使用情况作仔细分析和研究的情况下贸然的去修改Heap配置可能适得其反这里就来看一下Heap的一些概念和对于性能的影响 我们的应用所能够得到的最大的Heap受三部分因素的制约数据处理模型(位或者位操作系统)系统地虚拟内存总数和系统的物理内存总数首先Heap的大小不能超过不同操作系统的进程寻址范围当前大部分系统最高限度是GWindows通常是GLinux通常是G系统的虚拟内存也是分配的依据首先是不能超过然后由于操作系统支持硬盘来做部分的虚拟内存如果设置过大那么对于应用响应来说势必有影响再则就是要考虑同一台服务器上运行多个Java虚拟机所消耗的资源总合也不能超过可用资源就和前面OOM分析中的一样其实由于OS的数据处理模型的限制机器本身的硬件内存资源和虚拟内存资源并不一定会匹配那么在有限的资源下如何调整好资源分配对于应用来说尤为重要 关于Heap的几个参数设置 说了Heap的有限资源问题以后就来看看如何通过配置去改变JVM对于Heap的分配下面所说的主要是对于Java Heap的分配那么在申请了Java Heap以后剩下的可用资源就会被使用到Native Heap Xms: java heap初始化时的大小默认情况是机器物理内存的/这个主要是根据应用启动时消耗的资源决定分配少了申请起来会降低启动速度分配多了也浪费 Xmx:java heap的最大值默认是机器物理内存的/最大也就到G这个值决定了最多可用的Java Heap Memory分配过少就会在应用需要大量内存作缓存或者零时对象时出现OOM的问题如果分配过大那么就会产生上文提到的第二类OOM所以如何配置还是根据运行过程中的分析和计算来确定如果不能确定还是采用默认的配置 Xmn:java heap新生代的空间大小在GC模型中根据对象的生命周期的长短产生了内存分代的设计青年代(内部也分成三部分类似于整体划分的作用可以通过配置来设置比例)老年代持久代每一代的管理和回收策略都不相同最为活跃的就是青年代同时这部分的内存分配和管理效率也是最高通常情况下对于内存的申请优先在新生代中申请当内存不够时会整理新生代当整理以后还是不能满足申请的内存就会向老年代移动一些生命周期较长的对象这种整理和移动会消耗资源同时降低系统运行响应能力因此如果青年代设置的过小就会频繁的整理和移动对性能造成影响那是否把年青代设置的越大越好其实不然年青代采用的是复制搜集算法这种算法必须停止所有应用程序线程服务器线程切换时间就会成为应用响应的瓶颈(当然永远不用收集那么就不存在这个问题)老年代采用的是串行标记收集的方式并发收集可以减少对于应用的影响 Xss:线程堆栈最大值允许更多的虚拟内存空间地址被Java Heap使用 以下是sun公司的性能优化白皮书中提到的几个例子 对于吞吐量的调优机器配置G的内存个线程并发能力 java Xmxm Xmsm Xmng Xssk XX:+UseParallelGC XX:ParallelGCThreads= Xmxm Xmsm 配置了最大Java Heap来充分利用系统内存 Xmng 创建足够大的青年代(可以并行被回收)充分利用系统内存防止将短期对象复制到老年代 Xss 减少默认最大的线程栈大小提供更多的处理虚拟内存地址空间被进程使用 XX:+UseParallelGC 采用并行垃圾收集器对年青代的内存进行收集提高效率 XX:ParallelGCThreads= 减少垃圾收集线程默认是和服务器可支持的线程最大并发数相同往往不需要配置到最大值 尝试采用对老年代并行收集 java Xmxm Xmsm Xmng Xssk XX:+UseParallelGC XX:ParallelGCThreads= XX:+UseParallelOldGC Xmxm Xmsm 内存分配被减小因为ParallelOldGC会增加对于Native Heap的需求因此需要减小Java Heap来满足需求 XX:+UseParallelOldGC 采用对于老年代并发收集的策略可以提高收集效率 提高吞吐量减少应用停顿时间 java Xmxm Xmsm Xmng Xssk XX:ParallelGCThreads= XX:+UseConcMarkSweepGC XX:+UseParNewGC XX:SurvivorRatio= XX:TargetSurvivorRatio= XX:MaxTenuringThreshold= XX:+UseConcMarkSweepGC XX:+UseParNewGC 选择了并发标记交换收集器它可以并发执行收集操作降低应用停止时间同时它也是并行处理模式可以有效地利用多处理器的系统的多进程处理 XX:SurvivorRatio= XX:MaxTenuringThreshold= 表示在青年代中Eden和Survivor比例设置增加了Survivor的大小越大的survivor空间可以允许短期对象尽量在年青代消亡 XX:TargetSurvivorRatio= 允许%的空间被占用超过默认的%提高对于survivor的使用率 |