zoukankan      html  css  js  c++  java
  • jvm

     jvm快照参数配置

    使用的JVM参数的配置信息

    1.堆快照:-XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath=c:m.hprof

    2.错误处理:-xx:OnOutOfMemoryError=c: eset.bat

    3. -Xloggc:${目录}/managed1_gc.log  -XX:+HeapDumpOnOutOfMemoryError 

     

     

    3.怎样解决内存溢出问题

    首先通过看GC日志进行排查,gc的频率和次数。其次可以看dump堆的快照找到问题的所在,再结合一些工具,例如jprofiler来进行内存的跟踪,随时监视垃圾回收,线程允许的状况。

     

    4.JVM调优工具有哪些?

    Jconsole,jProfile,VisualVM。 堆信息查看,线程监控,热点分析。

    (CPU热点:检查系统哪些方法占用的大量CPU时间;

    内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计),

    内存泄露的检查(内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,

                            导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。)

    5.CPU使用率居高不下,肿么办?

    把那几个命令好好了解一下。调优的命令,好好记一下

    http://blog.csdn.net/jiangguilong2000/article/details/17971247

    详细的top命令请参考

    http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html

    http://blog.csdn.net/feihong247/article/details/7874063

       jstack:打印出给定的java进程ID,分析dump文件

       JPS:列出所有的jvm的实例

       dsta      

       首先通过TOP命令找到,所有线程对CPU占用的情况。然后通过jstack来对具体的线程进行具体的分析。

     

    6.JVM性能调优

         持久代用来防止类、类的一些常量操作

         1.类和接口的全限定名

         2、字段的名称和描述符

         3、方法和名称和描述符

         两个原则

         1.一个是将转移到老年代的对象数量降到最少

         因为老年代空间上的GC处理会花费更多的时间,减少被转移到老年代对象的数据可以显著地减少Full GC的频率。可以通过调整新生代空间的大小。

         2、另一个是减少full GC的执行时间

         FULL GC的执行时间要比Minor GC要长的多,因此如果full gc花费了太多的时间的话,一些连接可能会发生超时的错误。如果视图通过减少老年代空间来减少full GC执行的时间,可能会导致OutofMemoryError或者full gc执行的次数会增加。

     

         是否需要进行gc优化

         一般情况下,如果GC执行的时间只有0.1--0.3秒的话,就没必要浪费时间去进行GC优化,但是如果GC执行的时间在1秒或者2秒以上的话,GC将势在必行。

    一般下面情况下就不需要进行GC优化了

         1.Minor GC执行的很快(小于50ms)

         2.Minor GC执行的并不频繁(大概10秒一次吧)

         3.Full GC执行的很快(小于1秒)

         4.FULL GC执行的并不频繁(10分钟一次)

     

         3.调整GC类型/内存空间

          选择调整合适的GC类型和设定内存空间,针对性的优化

         4.分析结果

         调整了GC参数后,持续收集24小时日志,进行结果分析。如果幸运的话,就找到最适合系统的GC参数,反之就需要分析日志来检查内存是如何来分配的。然后需要不断的调整GC类型和内存空间大小找到最佳的参数

         5.如何设定空间大小

         一般老年代我建议设置为500M,也就是一次fullgc后,如果老年代剩余300M的话,这就是300M(程序占用)+500(老年代最小空间)+200M(空闲内存)

         至于新生代和老年代之间的比例呢一般设置为1比1

     

     

     

         代码优化

         1、尽量在合适的地方使用单例

         2、尽量避免随意使用静态变量

         例如 A类里面有一个静态变量B,此时静态变量B的声明周期与类A同步,如果A不卸载的话,对象会常驻在内存,直到程序终止

         3、尽力避免过多的创建java对象

         例如在循环中new 对象,因为系统不仅需要花费时间来创建对象,而且还需要花费时间来进行垃圾回收

         4、尽量使用final修饰符

         首先final修饰符的类是不可派生的,并且java编译器会寻找机会内联所有的final方法,能够提高性能一半

         5、尽量使用局部变量

         调用方法时,参数传递的都是临时变量,保存在栈中,其他变量入静态变量 实例变量都在Heap中创建。速度较慢

         6、慎用synchronized方法

         7、尽量使用stringbuilder和stringbuffer

         8、尽量不要使用finalize方法

         9、尽量使用基本类型代替对象

         10、单线程尽量使用hashmap、arraylist

         11、尽量合理的创建hashmap,避免进行hash重构

         12、尽量使用位移来代替A/B的操作。

     

              

         

     

  • 相关阅读:
    Docker 部署 ELK 收集 Nginx 日志
    编译安装python3事出错:
    Linux 系统中部署 LNMP 高可用负载均衡架构集群实现动态博客
    [转载]oracle调用JAVA授权问题
    [转载]浏览器跨域
    [转载]ftp和http区别
    [转载]oracle xml操作
    [转载]Oracle中TO_NUMBER()函数的用法
    [转载]桥接与NAT
    [转载]Oracle中动态SQL详解
  • 原文地址:https://www.cnblogs.com/xingzc/p/5748965.html
Copyright © 2011-2022 走看看