[LB-子牙] 性能调优专题:JVM
文章平均质量分 95
[LB-子牙] 性能调优专题:JVM
萧 炎
这个作者很懒,什么都没留下…
展开
-
TLAB、OOM、调优工具(实现原理)、调优实战
一、TLAB新生代堆区独享的堆区。因为并发情况下分配内存,会存在性能问题。所以为了解决这个问题,设计了一个在线程级别分配对象的功能,就是TLAB.New对象与指针碰撞new对象怎么就出问题了呢?java中我们要创建一个对象,用关键字new就可以了。但是,在我们日常中,有很多生命周期很短的对象。比如:public void dome(){ User user=new user(); user.sayhi();}这种对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着原创 2021-05-14 21:34:21 · 658 阅读 · 0 评论 -
深入理解垃圾回收器
〇、遗留的问题分代复制算法的指针移动原理数据发生了移动,为什么依然能够访问?底层原理:找OS要160B的内存一个cell是8B,需要20个cell五五分一半用,一般空闲JVM中的对象最小是16B其实底层算法都是基于规律来的指针压缩:基于8字节对齐可用内存列表:1、申请8B内存2、申请16B内存计算移动内存地址公式: From的起始地址 + Cell的起始位置 + 对齐字节数假设有内存如下:O-A、O-C是from区GC前的对象,假设本次GC这两个对象不被回收。那么这两个对原创 2021-05-11 17:33:15 · 391 阅读 · 0 评论 -
精讲垃圾回收算法
〇、补充-数组长度补讲数组长度:1、如果不压缩,则在arrayOopDesc中声明的非静态字段之后分配。此时存klass指针 + 数组长度要用 12字节eg: 11111 111112、如果压缩,它将占用oopDesc中_klass字段的后半部分此时存klass指针 + 数组长度要用 8字节。因为压缩后klass指针只占用4个自己,还剩4个空的字节,用来存储数组长度,而不是去再申请一个8个字节的长度,然后将压缩至4字节。eg:1111 [多出来的四个字节存数组长度:1010]这里是如何生省出原创 2021-05-10 23:26:13 · 266 阅读 · 8 评论 -
探索JVM底层之调优实战、对象内存布局、指针压缩
一、Oop原创 2021-05-06 21:14:40 · 337 阅读 · 0 评论 -
探索JVM底层之执行引擎、逃逸分析、标量替换、锁消除
执行引擎是什么?执行引擎是JVM运行java程序的一套子系统。执行引擎执行的就是字节码文件。语言的深度:Java->C++ -> 硬编码(010101 CPU指令)一、两种解释器1.1、字节码解释器将Java字节码-> 解释成C++代码 -> 运行硬编码早期的时候只有字节码解释器,但是由于字节码解释器性能比较低,才出现了模板解释器。 因为需要将java代码先转化成C++代码,再将C++代码转换成硬编码执行,比价耗费时间。而C++代码可以直接转化成硬编码,所以效率比较原创 2021-05-06 15:43:53 · 367 阅读 · 2 评论 -
String 深入JVM底层解析
一、说清常量池原创 2021-05-03 23:38:27 · 315 阅读 · 2 评论 -
内存池与JVM内存模型
一、内存池概览其实JVM中的内存池并不是真实存在的,它是OS堆中划分出来的一部分,会通过chunk来记录内存的使用。JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、程序计数器。二、结合实例代码分析public class Test { public static Test test4 = new Test(); public static void main(String[] args) {原创 2021-05-02 22:42:47 · 586 阅读 · 1 评论 -
JVM 字节码文件原理详解
一、进制知识我们看到的字节码文件是十六进制。我们用魔数cafebabe来练习一下进制转换:十六进制:c a f e b a b e十进制: 12 10 15 14 11 10 11 14二进制:1100 1010 1111 1110 …二、不同语言在JVM上运行的本质只要是复合JVM规范的字节码文件都能在虚拟机上运行。三、小端与大端大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺原创 2021-04-17 17:53:09 · 409 阅读 · 0 评论 -
JDBC使用SPI机制解析
一、问题引出:当我们在使用原生jdbc时通常写为以下格式:我们在加载驱动类的时候的静态代码块会帮助我们进行注册,所以我们再DriverManager中能够取得连接。但事实上,我们去掉第一行Class.forName后,我们依旧可以获得相应数据库的连接,那么数据库驱动类是什么时候加载的呢?虚拟机怎么会知道驱动类的路径呢?二、准备知识1、ServiceLoader类的使用。再次我们只是简要的概括ServiceLoader的作用:它是Jdk为我们提供的根据接口动态加载实现类(SPI机制)的工具。转载 2021-04-17 12:18:51 · 313 阅读 · 0 评论 -
JVM底层之类加载器详解
一、类加载器JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。JVM还支持自定义类加载器。各种类加载器之间存在着逻辑上的父子关系,但不是真正意义上的父子关系,因为它们直接没有从属关系。1.1、启动类加载器因为启动类是由C++编写的,所以当我们通过Java程序去看显示的是null。启动类加载器不像其原创 2021-04-15 22:36:15 · 1242 阅读 · 0 评论 -
Kclass模型和JVM类加载过程详解
一、Klass模型Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息……看下klass模型类的继承结构从继承关系上也能看出来,类的元信息是存储在原空间的;普通的Java类在JVM中对应的是instanceKlass类的实例,再来说下它的三个字类InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取到的Class对象,实际上就是这个C++类的实例,存储在堆区,学名镜像类InstanceR原创 2021-04-13 20:43:01 · 2133 阅读 · 1 评论