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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步了解jvm:jvm简介和简单调优相关的知识,希望对你有一定的参考价值。


** 首先份上一份比较详细的java虚拟机的思维导图:**

什么是jvm:

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

初步了解jvm:jvm简介和简单调优_java虚拟机

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

初步了解jvm:jvm简介和简单调优_老年代_02

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

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

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

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

栈:又叫线程站

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

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

特性:先进后出 【FILO】

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

通过javap 命令将Math.class(就是上面的java代码的类) 反编译一下,后面形成的就是如下图所示的指令码

初步了解jvm:jvm简介和简单调优_jvm性能调优_05


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

初步了解jvm:jvm简介和简单调优_java虚拟机_07

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

堆:

初步了解jvm:jvm简介和简单调优_java虚拟机_08

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

堆的内部结构:

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

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

什么是垃圾对象 :1.没有指针的对象 2.可达性分析算法

初步了解jvm:jvm简介和简单调优_java虚拟机_10

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

jvm垃圾收集机制 简单讲解

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

初步了解jvm:jvm简介和简单调优_老年代_11

下面是jvm的动态:

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

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

初步了解jvm:jvm简介和简单调优_java虚拟机_13

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

亿级电商流量的线上调优

一般亿级电商网站都是微服务架构,如图:

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

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

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


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


初步了解jvm:jvm简介和简单调优_jvm性能调优_17


初步了解jvm:jvm简介和简单调优_老年代_18

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

初步了解jvm:jvm简介和简单调优_jvm性能调优_19

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

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

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

初步了解jvm:jvm简介和简单调优_老年代_20

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

作者:宋文超super


以上是关于初步了解jvm:jvm简介和简单调优的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 JVM堆和栈 -- 初步了解

JVM:JVM 调优 - 从 Eclipse 开始

深入理解JVM——JVM性能调优实战

JVM宏观认知&&内存结构

JVM简介

Java-----JVM基础