001 JVM基础

1. Java虚拟机

        所谓虚拟机,就是一台虚拟的机器,其本质是一款软件,用来执行一系列虚拟计算机指令,宏观而言虚拟机可以分为系统虚拟机和程序虚拟机,大名鼎鼎的Visual Box、VMare就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
        程序虚拟机典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在java虚拟机中执行的指令称为java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

2.JVM内存模型(1.8)

        JDK1.8JVM运行时内存数据区域划分;1.8同1.7比,最大的差别就是:元数据区取代了永久代(方法区)。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于,元数据空间并不在虚拟机中,而是使用本地内存。

程序计数器:每个线程一块,指向当前线程正在执行的字节码代码的行号,如果当前线程执行的是native方法,则其值为null。
Java虚拟机栈:线程私有,每个线程对应一个Java虚拟机栈,其生命周期与线程同进同退;每个Java方法在被调用的时候都会创建一个栈帧,并入栈,一旦完成调用,则出栈。所有的的栈帧都出栈后,线程也就完成了使命。
本地方法栈: 功能与Java虚拟机栈十分相同,区别在于,本地方法栈为虚拟机使用到的native方法服务。

Java堆(Heap):堆是JVM内存占用最大,管理最复杂的一个区域;其唯一的用途就是存放对象实例:所有的对象实例及数组都在堆上进行分配。(1.7后,字符串常量池从永久代中剥离出来,存放在堆中,堆又进一步的内存分块划分,按照GC分代收集角度的划分.)

3.堆空间内存分配

默认堆分配如下:
• 老年代(Old Generation) : 三分之二的堆空间
• 年轻代 (Young Generation): 三分之一的堆空间
• 默认Young Generation区域划分如下:
• eden区: 8/10 的年轻代空间
• survivor0 (From): 1/10 的年轻代空间
• survivor1 (To): 1/10 的年轻代空间

例如:按照默认分配原则,已知Eden区为40M,那么堆的总大小应为多少?

• 根据比例可以推算出,两个survivor区各5M,年轻代50M。
• 老年代是年轻代的两倍,即100M。
• 那么堆总大小就是150M。

 查看Java虚拟机参数:(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html
• 初始值:java -XX:+PrintFlagsInitial -version
• 最终值:java -XX:+PrintFlagsFinal –version
• 运行时:jinfo -flag MaxHeapSize pid
• 运行时:jinfo -flags pid

模拟:

step1:启动测试程序(加&符号后台启动)

step2:定位pid

step3:jinfo查看参数

step4:jstat (jstat统计命令)

jstat -class pid times count(类统计)

jstat -class 3169 1000 5      每1秒钟输出一次3169的参数变化共输出5次

Class loader statistics.
Loaded: Number of classes loaded.(应用程序装载类的数量)
Bytes: Number of kBs loaded.(加载的字节量)
Unloaded: Number of classes unloaded.(应用程序卸载类的数量)
Bytes: Number of Kbytes unloaded.(卸载的字节量)
Time: Time spent performing class loading and unloading operations.(执行类加载和卸载操作的时间)

jstat -gc pid times count(GC统计)

jstat -gc 3169 1000 10

Garbage-collected heap statistics.
S0C: Current survivor space 0 capacity (kB).(当前S0区的初始化容量)
S1C: Current survivor space 1 capacity (kB).(当前S1区的初始化容量)
S0U: Survivor space 0 utilization (kB).(当前S0区使用量)【同一时间S0与S1区只能使用一个(复制算法)】
S1U: Survivor space 1 utilization (kB).(当前S1区使用量)
EC: Current eden space capacity (kB).(Eden区初始化容量)
EU: Eden space utilization (kB).(Eden使用量)
OC: Current old space capacity (kB).(Old区的初始化容量)
OU: Old space utilization (kB).(Old区使用量)
MC: Metaspace capacity (kB).(元空间容量)
MU: Metacspace utilization (kB).(元空间使用量)
CCSC: Compressed class space capacity (kB).(压缩区容量)
CCSU: Compressed class space used (kB).(压缩区使用量)
YGC: Number of young generation garbage collection events.(年轻代垃圾回收执行次数)
YGCT: Young generation garbage collection time.(年轻代垃圾回收耗时)
FGC: Number of full GC events.(FullGC执行次数)
FGCT: Full garbage collection time.(FullGC执行耗时)
GCT: Total garbage collection time.(垃圾回收总耗时)

YGC、YGCT、FGC、FGCT、GCT为重点关注数据;

FullGC即全量垃圾回收,年轻代和老年代一并执行一次垃圾回收;是非常消耗资源的一种事件,所以在实际生产中优化或排查时首先要排查FGC是否存在异常;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值