搞JAVA开发的朋友,最怕的就是之一:JVM调优 。实话实说,在工作中用的不是很多,只有出现问题了才会用到(也可以在项目发布时调整好相关参数,避免线上出问题) 。但是在面试中,这一块就是必须掌握的了,否则和HR聊薪水都会受到限制 。
主要内容:
- 小白也能看懂的JVM运行时数据区详解 。
- 垃圾回收,到底是怎么回收的?
- JDK8为什么要引入元空间替换永久代?
- CMS和G1垃圾收集器介绍
- 常见JVM参数介绍
- 堆空间如何设置?
- 元空间如何设置?
- 栈相关参数如何设置?
- 日志参数如何设置?
- 垃圾收集器如何配置?
- CMS和G1参数设置介绍
- 其他参数设置介绍
- 调优案例
我们先从 JVM(Java Virtual machine)的基本知识点开始聊 。Java 中的一些代码优化技巧,和JVM的关系非常的大,比如逃逸分析对非捕获型 Lambda 表达式的优化 。
在进行这些优化之前,你需要对 JVM 的一些运行原理有较深刻的认识,在优化时才会有针对性的方向 。
JVM 内存区域划分学习 JVM,内存区域划分是绕不过去的知识点,这几乎是面试必考的题目 。如下图所示,内存区域划分主要包括堆、Java 虚拟机栈、程序计数器、本地方法栈、元空间和直接内存这五部分,我将逐一介绍 。
文章插图
1.堆如 JVM 内存区域划分图所示,JVM 中占用内存最大的区域,就是堆(Heap),我们平常编码创建的对象,大多数是在这上面分配的,也是垃圾回收器回收的主要目标区域 。
2.Java 虚拟机栈JVM 的解释过程是基于栈的,程序的执行过程也就是入栈出栈的过程,这也是 Java 虚拟机栈这个名称的由来 。
Java 虚拟机栈是和线程相关的 。当你启动一个新的线程,Java 就会为它分配一个虚拟机栈,之后所有这个线程的运行,都会在栈里进行 。
Java 虚拟机栈,从方法入栈到具体的字节码执行,其实是一个双层的栈结构,也就是栈里面还包含栈 。
文章插图
如上图,Java 虚拟机栈里的每一个元素,叫作栈帧 。每一个栈帧,包含四个区域: 局部变量表 、操作数栈、动态连接和返回地址 。
其中,操作数栈就是具体的字节码指令所操作的栈区域,考虑到下面这段代码:
package com.tian.utils;public class Test {public int test() {int a = 1;a++;return a;}}
JVM 将会为 test 方法生成一个栈帧,然后入栈,等 test 方法执行完毕,就会将对应的栈帧弹出 。在对变量 a 进行加一操作的时候,就会对栈帧中的操作数栈运用相关的字节码指令 。我们对上面这个类进行编译成Test.class文件后,使用命令:
javap -verbose -c Test.class >test.txt
这样就会把这个类的字节码指令输出到test.txt文件中:Classfile /E:/workspace/other/hAppy-mall/target/classes/com/tian/utils/Test.classLast modified 2022-3-23; size 369 bytesMD5 checksum 58d655b96f21dd36600ad0a8df0efa70Compiled from "Test.java"public class com.tian.utils.Testminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPERConstant pool:#1 = Methodref#3.#17// java/lang/Object."<init>":()V#2 = Class#18// com/tian/utils/Test#3 = Class#19// java/lang/Object#4 = Utf8<init>#5 = Utf8()V#6 = Utf8Code#7 = Utf8LineNumberTable#8 = Utf8LocalVariableTable#9 = Utf8this#10 = Utf8Lcom/tian/utils/Test;#11 = Utf8test#12 = Utf8()I#13 = Utf8a#14 = Utf8I#15 = Utf8SourceFile#16 = Utf8Test.java#17 = NameAndType#4:#5// "<init>":()V#18 = Utf8com/tian/utils/Test#19 = Utf8java/lang/Object{public com.tian.utils.Test();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1// Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 3: 0LocalVariableTable:StartLengthSlotNameSignature050thisLcom/tian/utils/Test;public int test();descriptor: ()Iflags: ACC_PUBLICCode:stack=1, locals=2, args_size=10: iconst_11: istore_12: iinc1, 15: iload_16: ireturnLineNumberTable:line 5: 0line 6: 2line 7: 5LocalVariableTable:StartLengthSlotNameSignature070thisLcom/tian/utils/Test;251aI}SourceFile: "Test.java"
上面这段字节码代码,可能很多人都看不懂,建议结合:推荐阅读
- 大一新生入学必备清单 上大学要带什么东西
- |混职场必备的五句防身“黑话”,你真正懂得几句,不来了解一下?
- 工作室|梦幻西游:抢资材必备的姿势,新旧两版来回切换,资材量能翻倍
- 鸡胸肉|减脂必备主食:瘦身菜团子,口感鲜香,饱腹感强,好吃不长胖
- 初一女生开学必备物品清单 开学必备物品清单女生
- 中学|县城中学招语文老师,“一个必备条件”让人意外,普通人达不到
- 三角形斜边长度怎么算必备计算公式 直角三角形斜边怎么算
- 韩国旅游必备地图APP 综合评测 韩国旅游地图
- 家电选购全攻略 家电选购必备指南
- 森林燃气灶必备品牌荣誉