• jvm


    jvm
    JVM虚拟机
    JVM管理的内存段可分为两大类:线程共享内存和线程私有内存
    线程共享内存:
    方法区:存储jvm加载的class,常量,静态变量,即时编译器编译后的代码等
    Java堆:存储java的所有对象实例,数组等
    线程私有内存:
    程序计数寄存器:每个线程都有自己的计数寄存器,存储当前线程执行字节码的地址;
    jvm栈:jvm会为每个运行线程分配一个栈区,线程调用方法时和方法返回时会进行入栈和出栈操作;
    本地方法栈区:与jvm stack类似,只不过此区域是为调用本地方法服务
    JVM HEAP内存空间:
    新生代:
    新生区:Dden:初创对象
    存活区:survivor:步入成熟区的初创对象:
    ss1:
    ss2:
    老年代:
    mark(先标记)---->compact
    持久代:
    垃圾回收器:
    新生代回收:Minor GC
    老年代回收:Major GC (Full GC)
    堆内存空间的调整参数:
    -Xmx:新生代和老年代总共可用的最大空间;
    -Xms:二者初始空间之和;
    -XX:NewSize:新生代初始空间;
    -XX:MaxNewSize:新生代的最大空间;
    -XX:MaxPermSize:持久代最大空间;
    -XX:PermSize:持久代初始空间;
    tomcat而言:
    Catalina.sh中有两个环境变量:
    CATALINA_OPTS:仅对启动运行tomcat实例的java虚拟机有限;
    JAVA_OPTS:对本机上所有的Java虚拟机有限;
    ##############################################
    性能监控工具:
    问题:
    OutOfMemoryError:内存不足:
    内存泄漏:
    线程锁死:
    锁竞争:Lock Contention
    java消耗过多的CPU
    jps:java virtual machine process status tool 监控jvm进程状态信息
    jps [options] [hostid]
    -m:输出传入main方法的参数;
    -l:显示main类或jar的完全限定名称;
    -v:显示为jvm虚拟机指定的参数;
    ---------------------------------------
    jstack:查看某个java进程内的线程堆栈信息
    jstack [options] pid
    选项:
    -l long strings:输出完成的锁信息;
    -m :混合模式:即会输出java堆栈及C/C++堆栈信息;
    ---------------------------------------
    jmap 和jhat:
    jmap:jvm memory map:查看堆内存使用情况;
    jhat:java heap analysis tool :heap堆分析工具
    jmap [options] pid
    -heap:详细堆内存空间使用状态信息
    -histo[:live]:查看堆内存中的对象数目,大小统计结果
    # jmap -dump:live,format=b,file=outfile pid 指定live选项,那么只输出活的对象到文件
    # jmap -dump:format=b,file=/tmp/outfile pid
    使用hprof二进制形式,输出jvm的heap内容到文件
    dump出来的文件可以用MAT、VisualVM等工具查看,或用jhat查看
    注意:如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat,然后在浏览器输入主机:9998查看了
    # jmap -head java_pid
    查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
    using parallel threads in the new generation.  #新生代采用的是并行线程处理方式
    using thread-local object allocation.   
    Concurrent Mark-Sweep GC   #同步并行垃圾回收
     
    Heap Configuration:  #堆配置情况
       MinHeapFreeRatio = 40 #最小堆使用比例
       MaxHeapFreeRatio = 70 #最大堆可用比例
       MaxHeapSize   = 2147483648 (2048.0MB) #最大堆空间大小
       NewSize     = 268435456 (256.0MB) #新生代分配大小
       MaxNewSize    = 268435456 (256.0MB) #最大可新生代分配大小
       OldSize     = 5439488 (5.1875MB) #老生代大小
       NewRatio     = 2  #新生代比例
       SurvivorRatio  = 8 #新生代与suvivor的比例
       PermSize     = 134217728 (128.0MB) #perm区大小
       MaxPermSize   = 134217728 (128.0MB) #最大可分配perm区大小
     
    Heap Usage: ##堆使用情况
    New Generation (Eden + 1 Survivor Space):  #新生代(伊甸区 + survior空间)
       capacity = 241631232 (230.4375MB)  #伊甸区容量
       used     = 77776272 (74.17323303222656MB) #已经使用大小
       free     = 163854960 (156.26426696777344MB) #剩余容量
       32.188004570534986% used ##使用比例
    Eden Space:  ##伊甸区
       capacity = 214827008 (204.875MB) ##伊甸区容量
       used     = 74442288 (70.99369812011719MB) #伊甸区使用
       free     = 140384720 (133.8813018798828MB) #伊甸区当前剩余容量
       34.65220164496263% used #伊甸区使用情况
    From Space: ##survior1区
       capacity = 26804224 (25.5625MB) #survior1区容量
       used     = 3333984 (3.179534912109375MB) #surviror1区已使用情况
       free     = 23470240 (22.382965087890625MB) #surviror1区剩余容量
       12.43827838477995% used ##survior1区使用比例
    To Space: ##survior2 区
       capacity = 26804224 (25.5625MB) #survior2区容量
       used     = 0 (0.0MB) #survior2区已使用情况
       free     = 26804224 (25.5625MB) #survior2区剩余容量
       0.0% used ## survior2区使用比例
    concurrent mark-sweep generation: #老生代使用情况
       capacity = 1879048192 (1792.0MB) #老生代容量
       used     = 30847928 (29.41887664794922MB) #老生代已使用容量
       free     = 1848200264 (1762.5811233520508MB) #老生代剩余容量
       1.6416783843721663% used #老生代使用比例
    Perm Generation: #perm区使用情况
       capacity = 134217728 (128.0MB) #perm区容量
       used     = 47303016 (45.111671447753906MB) #perm区已使用容量
       free     = 86914712 (82.8883285522461MB) #perm区剩余容量
       35.24349331855774% used #perm区使用比例
    #jmap -histo[:live] java_pid
    查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
    num #instances #bytes class name
    ----------------------------------------------
    1: 41909 8247920 [C
    2: 14409 5753912 [B
    3: 5428 1246440 [I
    4: 39973 959352 java.lang.String
    5: 20718 662976 java.util.HashMap$Node
    6: 5242 461296 java.lang.reflect.Method
    7: 6990 423744 [Ljava.lang.Object;
    注:class name是对象类型
    B  byte C  char D  double F  float I  int J  long Z  boolean [  数组,如[I表示int[] [L+类名 其他对象
    ----------------------------------------
    jstat:jvm统计监控工具
    jstat -<options> [-t] [-h<lines>] <vmid> [<interal> [<count>]]
    其中option为必须提供的选项,所有可用选项可用jstat -option列出
    -class
    -compile
    -gc
    -gccapacity
    -gccaus
    ......
    字段意义:
    S0C,S1C,S0U,S1U:C表示容量,U表示已用量;
    EC,EU:Eden区域的容量和已用量;
    OC,OU:
    PC,PU:
    YGC,YGT:新生代的GC次数和耗时;
    FGC,FGCT:Full GC 次数和耗时;
    GCT:GC总耗时;
    两个GUI工具:jconsole,jvisualvm
  • 相关阅读:
    COCOS2D-X中UI动画导致闪退与UI动画浅析
    使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
    algorithm 学习之 for_each
    cocos2dx 3.2 Touch Listen和menu回调实现截屏
    Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个
    python 装饰器模式 我的理解
    Https SSL Knowledge & how to get a self-signed certificate on ubuntu.
    公钥和私钥的理解
    Openwrt UCI 快捷切换SS 配置
    iptables ipset 实用命令
  • 原文地址:https://www.cnblogs.com/skyzy/p/9433534.html
Copyright © 2020-2023  润新知