Java性能调优(五)

JVM调优

Java内存模型

  • 程序计数器:可以看作是当前线程所执行的字节码文件(class)的行号指示器。如果执行的是java方法,那么记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,计数器的值为空(undefined)。
  • 虚拟机栈:线程私有,每一个方法执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程。
  • 本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
  • Java堆:存放运行时产生的对象,数组。
  • 方法区:存放类型信息、常量池。

垃圾回收算法

  • 引用计数算法(引用则+1,引用失效则-1,无法处理循环引用)
  • 标记-清除算法(从根节点出发,标记所有可达的对象,未被标记的对象则判定为垃圾,需要清除,回收后内存空间不连续)
  • 复制算法(将内存分成两块,只使用其中一块,垃圾回收时,则将存活的对象复制到另一块,同时清除这块内存的数据,内存使用浪费)
  • 标记-压缩算法(从根节点出发,标记所有可达的对象,并将这些对象压缩到一块内存空间上,之后清除这块空间之外的数据,效率相对慢一点)

垃圾收集器

常用JVM参数

-vmargs :说明后面是VM的参数
-Xmx:最大允许的堆内存
-Xms:初始分配的堆内存
-Xmn:新生代内存(推荐值为整个堆的3/8 )
-Xss:每个线程的栈大小
-XX: PermSize=:初始分配的非堆内存
-XX: MaxPermSize=:最大允许分配的非堆内存
-XX:PrintGCDetails:打印GC详细日志
-Xloggc:输出GC日志到目录

常用调优策略

  • 将新对象预留在新生代(设置合理的-Xmn值)
  • 大对象直接进入老年代(-XX:PretenureSizeThreshold)
  • 设置对象进入老年代的年龄(-XX:MaxTenuringThreshold)
  • 稳定的堆大小(-Xmx和-Xms设置成一致)

 

posted @ 2017-04-25 09:22  leafsunday  阅读(144)  评论(0编辑  收藏  举报