初步了解jvm:jvm简介和简单调优

首先份上一份比较详细的java虚拟机的思维导图: https://www.processon.com/vie...

什么是jvm:

简述就是 : JVM是Java Virtual Machine(Java虚拟机)的缩写,java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。通过jvm虚拟机可以实现跨平台运作。

初步了解jvm:jvm简介和简单调优_第1张图片

  • 如图可以知道 jdk = java-tool + jre ,而jre 包含了jvm*

初步了解jvm:jvm简介和简单调优_第2张图片

如图可以看出jvm在不同的操作系统可以生成不同 的机器码,这样就实现了跨平台使用。

jvm底层完整的运行示意图:

初步了解jvm:jvm简介和简单调优_第3张图片

初步了解jvm:jvm简介和简单调优_第4张图片

栈:又叫线程站

栈内存 存放 程序运行的局部变量 =》如静态变量

每个线程运行 jvm都会在栈内存开辟一个空间

特性:先进后出 【FILO】

栈帧:JVM 执行 Java 程序时需要装载各种数据到内存中,不同的数据存放在不同的内存区中(逻辑上)

通过javap 命令将Math.class(就是上面的java代码的类) 反编译一下,后面形成的就是如下图所示的指令码
初步了解jvm:jvm简介和简单调优_第5张图片

初步了解jvm:jvm简介和简单调优_第6张图片

ps: 方法出口就是a调用b的方法时“口子/位置” 就是b方法的出口

堆:

初步了解jvm:jvm简介和简单调优_第7张图片

这个局部变量是对象类型(new出来的),然后会将这个对象的指针【内存地址】存放到堆里面。

堆的内部结构:

初步了解jvm:jvm简介和简单调优_第8张图片

一般new出来的对象放在Eden区。【一旦Eden区放满了 =》会触发 minor GC 1. 非垃圾对象就把它放进From区 同时jvm会分代年龄加一 2.把‘’垃圾‘’对象清理掉 】

什么是垃圾对象 :1.没有指针的对象 2.可达性分析算法
初步了解jvm:jvm简介和简单调优_第9张图片

当老年代都放满了,就会触发Full GC。

jvm垃圾收集机制 简单讲解

下图是一个多线程程序 一直new对象 往【堆】内存里面放

初步了解jvm:jvm简介和简单调优_第10张图片

下面是jvm的动态:
初步了解jvm:jvm简介和简单调优_第11张图片

STW:Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。会让应用程序暂时停止。

初步了解jvm:jvm简介和简单调优_第12张图片

JVM调优的重点就是减少STW的次数 ,因为大并发的情况下 STW的影响是很大的 ,用户体验极度不好。

亿级电商流量的线上调优

一般亿级电商网站都是微服务架构,如图:
初步了解jvm:jvm简介和简单调优_第13张图片

推算网站大促每秒订单数和机器分配资源 到消耗内存

初步了解jvm:jvm简介和简单调优_第14张图片

推算一个订单对象的大小:一个对象一个1024个字节【1kb】 (ps:Int对象4个,string 占用最大字节= 长度*2)

初步了解jvm:jvm简介和简单调优_第15张图片

ps: 在eden区能存活一次的对象 ,会被放入Survivor 区

一个对象是移动到老年代 而不是年轻代[Survivor 区],判断标准:
1.对象存活时间比较长【经过15次的MInor GC】
2.对象占用内存Survivor 区的一半内存【根据实际硬盘分配设置】,就会直接分配到老年代

如图中的对象jvm参数设置的
13秒后就会让eden区占满,
Survivor 区占100M内存,每次都会被分配到老年代,当5-6分钟后老年代占满了 触发Full GC ,从而出现应用卡顿/暂停的现象,这是我们不愿意见到的。所以需要jvm调优。

初步了解jvm:jvm简介和简单调优_第16张图片

这样25秒左右才能占满Eden区,然后60M的对象也能放入survivor区(没超过其中一半),当survivor区放满是 会触发Minor Gc可以把之前的垃圾对象进行回收,一般情况下 就不会有什么对象进入老年代,不会触发Full GC

本文来源于:宋文超super,专属平台有csdn、思否(SegmentFault)、 简书、 开源中国(oschina)、掘金,转载请注明出处。

你可能感兴趣的