zoukankan      html  css  js  c++  java
  • JVM监控和Java应用程序调试

    JConsole、VisualVM监控JVM(JMX)

    JAVA_OPTS后加:-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

    JVM远程调试

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50050

    OR:

    JAVA_OPTS="-server -Xms2g -Xmx5g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnload
    ingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,server=y,
    suspend=n,address=50050 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.managem
    ent.jmxremote.ssl=false"

    jVisualVm--本地图形监控远程Spark的GC情况--Visual GC插件

    --监控主机上的所有JVM实例
    1、远程集群:需要简单配置并启动jstatd。方法比较简单,共两步:
    i. 在JAVA_HOME的bin目录下新建一个jstatd.all.policy的文件,文件内容为:
    grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
    };
    ii. 进入JDK bin目录,执行:./jstatd -J-Djava.security.policy=./jstatd.all.policy &。

    []内的参数可选,将命令中的yourip替换成Spark的master所在的node的地址,该地址也是jvisualvm需要连接的地址。确保不会报RMI和Connect的错误。
    2、本地主机:无需配置,启动jvisualvm即可

    堆(Heap) :JVM管理的内存叫堆

    分代:根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不同代的特点采用不同的收集算法,扬长避短也。

    Young(年轻代)

    年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor复制过来的对象。而且,Survivor区总有一个是空的。

    Tenured(年老代)

    年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

    Perm(持久代)

    用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

    GC的基本概念

    gc分为full gc 跟 minor gc,当每一块区满的时候都会引发gc。

    Scavenge GC

    一般情况下,当新对象生成,并且在Eden申请空间失败时,就触发了Scavenge GC,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。

    Full GC

    对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此应该尽可能减少Full GC。有如下原因可能导致Full GC:

    1.上一次GC之后Heap的各域分配策略动态变化

    2.System.gc()被显示调用

    3.Perm域被写满

    4.Tenured被写满

    命令行启动Java

    export COLLECTOR_LIB_DIR=${COLLECTOR_HOME}/lib

    export COLLECTOR_JVM_HEAP_OPTS="-Xms1g -Xmx1536m -Xmn512m"

    export COLLECTOR_JVM_OPTS="-server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true"

    export COLLECTOR_LOG_OUT=${COLLECTOR_LOG_DIR}/"collector.out"

    export COLLECTOR_JVM_GC_OPTS="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:${COLLECTOR_LOG_DIR}/collector_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${COLLECTOR_LOG_DIR}"

    nohup "$JAVA" $COLLECTOR_JVM_OPTS $COLLECTOR_JVM_HEAP_OPTS $COLLECTOR_JVM_GC_OPTS $COLLECTOR_JVM_JMX_OPTS -cp "$COLLECTOR_LIB_DIR/*:$COLLECTOR_CONF_DIR/*" $COLLECTOR_CLASS > "$COLLECTOR_LOG_OUT" 2>&1 < /dev/null &

    参考:

    http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

  • 相关阅读:
    kotlin类与对象——>对象表达式与对象声明、内联类
    kotlin类与对象——>嵌套类与内部类、枚举类
    kotlin类与对象——>数据类、密封类、泛型
    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
    xcode 统计代码行数
    iOS 常用的一些公用方法
    如何在一个项目中去建立多个Target
    instrument linker 的使用
    25 优化技巧
    二维码生成与扫描
  • 原文地址:https://www.cnblogs.com/warmingsun/p/5130778.html
Copyright © 2011-2022 走看看