JVM调优

                                        ****JVM调优(无监控不调优)****
    内容:
    JAVA内存结构
    堆内存的构成
    堆内存参数调整(用VisualVM观察虚拟机堆信息)
    垃圾收集算法
    垃圾收集器选择
    调优Tomcat并使用JMeter进行测评

一、JAVA内存结构
虚拟机栈、堆、方法区(永久区:class、静态变量、常量池等)、程序计数器、本地方法栈、执行引擎、本地库接口。
结论:能够优化的只有堆。
JAVA内存结构图
二、堆内存
新生代:eden、survivor、survivor
老年代:tenured
三、GC如何确定垃圾
什么是垃圾:如果一个对象有一个以上的引用指向它,那它就表示活着,否则就是死亡了,也被称为垃圾,但是要考虑循环引用的问题。
如何确定垃圾:
引用计数:会有循环引用的问题
正向可达:从roots对象计算可以到达的对象
四、垃圾回收算法
标记清除(Mark-Sweep):内存碎片化,不连续
标记清除算法
复制(Copying):效率高,但是浪费内存
复制算法
标记压缩(Mark-Compact):是在复制算法的基础上进一步的提升
标记压缩算法
分代算法(Generational Collection):这是现在大多数JVM所采用的算法;核心思想是根据对象的生命周期,将内存划为若干个不同的区域
五、JVM参数
- 标准参数,所有JVM都应该支持
-X 非标,每个JVM实现都不同
-XX 不稳定参数,下一个版本可能取消
六、垃圾回收器
Serial Collector –> XX:+UseSerialGC(单线程)
Perallel Collector –>并发量大,不过每次垃圾收集,JVM有停顿
CMS Collector –>停顿时间短
G1 – 不仅停顿时间短,同时并发量比较大
JAVA对象的分配
·栈上分配
·线程私有小对象
·无逃逸
·支持标量替换
·无需调整
·线程本地分配TLAB
·占用eden,默认1%
·多线程的时候不用竞争eden就可以申请空间,提高效率
·小对象
·无需调整
·老年代
·大对象
·eden
example1:
-XX:-DoEscapeAnalysis -XX:-EliminateAllocations -XX:-UseTLAB -XX:PrintGC(PrintGCDetails) 关闭逃逸分析,关闭标量替换,关闭线程本地内存,打印GC信息

    public class T01{
    class User{
       int id ;
       String name ;
       User(int id,String name){
          this.id = id;
          this.name = name;
       }
    }
    void alloc(){
       new User(i,"name"+i); 
   }
   public static void main(){
       T01 t = new T01();
       long s1 = System.currentTimeMillis();
       for(int i =0;i<10000000;i++) t.alloc(i);
       long s2 = System.currentTimeMillis();
       System.out.println(s2-s1);
   }
}
Runtime类可以大致的计算内存情况:Runtime.getRuntime.totalMemory();Runtime.getRuntime.freeMemery();
内存溢出:-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\tmp\jvm.dump -Xms10M -Xmx10M(内存文件查看工具VisualVM)

七、常用参数设置
·堆设置
·-Xms:初始堆大小
·-Xmx:最大堆大小
·-Xss:线程栈大小
·-XX:NewSize=n:设置年轻代大小
·-XX:NewRatio=n:设置年轻代和老年代的比值。如3,表示年轻代与老年代比值为1:3,年轻代占整个年轻代老年代的1/4
·-XX:NewSurvivorRatio=n:年轻代中Eden与Survivor区的比值。注意:Survivor是两块区域;如:3,表示Eden:Survivor= 3:2,Survivor占整个年轻代的1/5
·-XX:MaxPermSize=n:设置持久代大小
·收集器设置
·-XX:+UseSerialGC:设置串行收集器
·-XX:+UseParallelGC:设置并行收集器
·-XX:+UseConcMarkSweepGC:设置并发收集器
·垃圾回收统计信息
·-XX:PrintGC
·-XX:PrintGCDetails
·-Xloggc:filename
八、典型Tomcat优化配置
·set JAVA_OPTS =
·-Xms4g
·-Xmx4g
·-Xss512k
·-XX:AggressiveOpts
·-XX:UseBiasedLocking
·-XX:PermSize=64M //1.8取消了
·-XX:MaxPermSize=300M
·-XX:+DisableExplicitGC //System.gc()禁掉手动调用垃圾回收器
·-XX:+UseConcMarkSweepGC –>使用CMS缩短响应时间并发收集、低停顿
·-XX:+UseParNewGC –>并行收集新生代的垃圾
·-XX:+CMSParallelRemarkEnabled –>在使用UseParNewGC的情况下,尽量减少mark的时间
·-XX:+UseCMSCompactAtFullCollection –>使用并发收集器时,开启对老年代的压缩,使碎片减少
·-XX:LargePageSizeInBytes=128m –>内存分页大小对性能的提升
·-XX:+UseFastAccessorMethods –>get/set方法转成本地代码
·-Djava.awt.headless=true –>修复linux下tomcat处理图表时可能会产生的一个bug
·JAVA_OPTIONS=”${JAVA_OPTIONS} -Djava.security.egd=file:/dev/./urandom” export JAVA_OPTIONS 解决weblogic 启动慢的问题
九、参考资料
·oracle网站 HostSpot Virtual Machine Garbage Collection Tunning Grade Release 8
·Java虚拟机-JVM各种参数配置大全详细
·基于JVM(内存)和Tomcat性能调优
·Tomcat 7优化前及优化后的性能对比
·深入JAVA 虚拟机

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值