衡量系统性能的点
  • 执行速度:即响应时间
  • 内存分配:内存分配是否合理,是否过多消耗内存或者存在内存泄露
  • 启动时间:程序从启动到正常处理业务需要的时间
  • 负载承受能力:当系统压力上升,系统执行速度和响应时间上升曲线是否平缓

系统调优层次
  • 系统设计调优
  • 代码调优
  • jvm调优
  • 数据库调优
  • 操作系统调优

垃圾回收基础

垃圾回收算法:

  • 引用计数法:每个对象都有一个引用计数器,当被一个对象引用的时候计数器+1,当引用失效的时候计数器-1,当计数器为0的时候就可以被回收掉。这种算法的缺陷是,不能解决循环引用的问题,当A\B相互引用的时候,各自的引用计数器都为1,但是他们都没有被第三个对象所引用,所以是可以被回收掉的。由于由这种缺陷,引用计数法不适合JVM的垃圾回收。

  • 标记-清除算法:标记清除法是现代垃圾回收算法思想的基础。从根节点开始,通过标记根节点开始所有可达的对象,标记完成后,对未标记的对象进行清除。这种算法的缺点是,清除后会出现不连续的内存区域。不连续的内存空间效率比连续的内存空间要低。

  • 复制算法:把内存区域分成2块。一块是正在使用的,一块是没有在使用的。当进行垃圾回收的时候,把存活的对象从正在使用的区域复制到非正在使用的区域,然后清除正在使用区域的所有对象,交换2个内存的角色完成垃圾回收。这样可用区域的内存就连续了。如果垃圾对象多余存活对象,这种方式效果就比较好。

    java新生代垃圾串行回收器使用了复制算法的思想。

  • 标记压缩算法:适合老年代回收算法。在标记清除法的基础上做了优化。当需要回收的对象比较少的时候,这种算法比较高效。标记完后,把存活的对象压缩到内存的一端,然后把垃圾对象清理,这样就避免了不连续区域。

  • 增量算法:对于大部分垃圾回收算法,垃圾回收的时候会stop the world,所有应用的线程都会挂起,导致停顿。增加的话,是分区域垃圾回收,减少垃圾回收的范围,然后再间歇运行下应用程序。

  • 分代:将内存区域根据对象特点分成几块,不同的块使用不同的垃圾回收算法。在Hot Spot虚拟机中,所有新建的对象都放到新生代,当一个对象经过几次回收仍然存活就放入老年代

内存区域 使用的算法
新生代 复制算法
老年代 标记压缩算法

JVM调优常见案例
  • 大对象进入老年代:新生的大对象如果放在新生带可能会扰乱新生代的内存回收,因为新生代如果被大对象挤满了,新产生的对象都会被挤过去老年代, -XX:PretenureSizeThreshold 设置大对象直接进入老年代的阈值。 如果进入了老年代,又比较短命的话,标记压缩算法又会很不利,所以如果短命的大对象太多,对垃圾回收是一种灾难。

  • 设置进入老年代的年龄:新生代进入老年代和年龄有关。新对象会放在eden区,如果经过一次回收仍然存活,则被放入survivior区,对象年龄增加1。如果年龄达到的阈值就会被挪到老年代。-XX:MaxTenuringThreshold 设置最大年龄。

  • 稳定与震荡的堆大小: 稳定的堆大小会减少GC的次数,因此有的人会设置最小堆内存和最大堆内存成一样的值。但是GC堆大的话也会影响单次GC的时间。因此出了Xmx和Xms外还提供了以下参数。当Xmx和Xms一样的时候以下参数无效。

参数 作用
-XX:MinHeapFreeRatio:40 堆空间最小空闲比例,默认是40。当空闲的小于40%的时候,会扩大堆空间,确保程序空闲的时候震荡不会太大。
-XX:MaxHeapFreeRatio:70 堆空间最大空闲比例,默认是70。当空闲的空间大于70%的时候,会压缩堆空间。

实用案例

  • 吞吐量优先案例(32核,4G)
启动参数 参数解析
-Xmx3800m -Xms3800m 减少堆震荡和频繁GC。吞吐量大,内存一般都会维持在较高水平
-Xss128k 减少线程栈大小,剩余的系统内存支持更多的线程。
-Xmn2g 设置新生代大小
-XX:UseParallelGC 新生代使用并行回收器
-XX:ParallelGCThreads=20 设置垃圾回收线程总数
-XX:UseParallelOldGC 老年代也使用并行回收器
  • 使用大叶案例:在Solaris系统中,jvm支持大页使用 -XX:LargePageSizeInBytes=256m

  • 降低停顿案例

启动参数 参数解析
-XX:ParallelGCThreads=20 设置垃圾回收线程总数
-XX:UseParallelGC 新生代使用并行回收器
-XX:UseConcMarkSweepGC 老年代使用CMS收集器降低停顿
-XX:SurvivorRatio=8 eden区:survivor区 = 8:1 稍大的survivor区,可以提高在新生代回收声明周期较短的对象的可能性,避免进入老年代
-XX:TargetSurvivor=90 设置survivor的可使用率为90%,默认是50%,提高了survivor区的实用率
-XX:MaxTenuringThreshold=31 设置年轻代进入老年代的年龄,默认是15,这里设置成31,尽可能地将对象保存在新生代

java程序性能优化读书笔记-垃圾回收的更多相关文章

  1. Java程序性能优化读书笔记(一):Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...

  2. Java程序性能优化-读书笔记(一) 单例模式

    单例模式: 目的: 确保系统中一个类只产生一个实例. 好处: 1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销. 2.由于new操作的次数减少, ...

  3. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  4. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  5. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

  6. Java程序性能优化之性能概述

    性能的基本概念 一).什么叫程序的性能? 程序运行所需的内存和时间. 二).性能的表现形式: 1).执行速度: 程序的反应是否迅速,响应时间是否足够短. 2).启动时间:程序从运行到可以处理正常业务所 ...

  7. 《Java程序性能优化》学习笔记 设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  8. Java程序性能优化Tip

    本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...

  9. java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

随机推荐

  1. Windows与Linux 互相访问,挂载过程

    开始使用Linux时浏览器无法访问,多次尝试以失败告终,果断放弃自我动手, 找了大神帮助,弄了半天终于可以访问.但是之前在Windows下的文件也不能放弃,从大神那里那里文档,然后进行尝试 1.在Wi ...

  2. Java代理全攻略【有瑕疵:字节码生成部分没看到,最后两节没仔细看,累了】

    Java代理 1.代理模式 定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 其实就是委托.聚合.中间人. 为了保持行为的 ...

  3. 深入浅出TFS——创建WorkItem

    使用场景:在项目交付流程当中,我们在准备部署项目的时候,比如需要依次部署到DEV.QA和PROD共3个不同的环境.我们需要由专门负责部署的部门Integration Team的人员来操作.这个时候我们 ...

  4. 访问一个HTTPS的网站的大致流程

    浏览器向服务器发送请求,请求中包括浏览器支持的协议,并附带一个随机数. 服务器收到请求后,选择某种非对称加密算法,把数字证书签名公钥.身份信息发送给浏览器,同时也附带一个随机数. 浏览器收到后,验证证 ...

  5. 《面向对象程序设计》 三 Calculator 计算器初步

    Git传送门 纸上得来终觉浅,绝知此事要躬行. 学习了一些c++的相应知识后,虽然了解写法,真正操作时还是出现小错误.要多操作,记住关键点,避免不该有的小错误. 写分文件类外定义时出现了问题.在Sca ...

  6. vs环境变量学习

    1. 查看vs环境变量: 在项目设置中的任何路径.目录编辑项目下,右下角有个“宏”,点开即可见所有vs环境变量的当前设置...听说还有其它地方,没看到. 2.上边的“宏”,即是英文的vs环境变量 3. ...

  7. Oracle 关于WKT构造SDO_GEOMETRY的问题。

    由于系统前端使用OpenLayers框架,后台数据库使用oracle spatial.大家知道Oracle spatial的SDO_GEOMETRY十分复杂,如果使用期java api ,那就坑爹了, ...

  8. Spark系列-核心概念

    Spark系列-初体验(数据准备篇) Spark系列-核心概念 一. Spark核心概念 Master,也就是架构图中的Cluster Manager.Spark的Master和Workder节点分别 ...

  9. SSM框架之关于使用JSP作为视图展示问题解决方案

    JSP作为视图层展示数据,已经有很长一段时间了,不管是在校学习还是企业工作,总会或多或少接触这个.特别是对于一些传统中小型或者一些几年前的企业而言,有很多使用JSP作为视图展示层. JSP本质是就是S ...

  10. Linux服务器之间免密同步文件、重启R服务

    机器:ML-01/ML-02/ML-03 需求: 1.在ML-01上自动将文件同步至ML-02/ML-03 2.在ML-01上通过脚本重启ML-02/ML-03上的R服务 说明:以下示例中,ML-02 ...