- 博客(11)
- 收藏
- 关注
原创 Mysql中的B+Tree
磁盘相关知识 系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。 InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小: mysql> show variables like 'innodb_page_size'; B+树的定义
2021-08-18 16:50:06
234
原创 CPU或内存占用过高排查思路
1.先使用top命令找出占用cpu/内存最高的进程id 2.再用ps -mp pid -o THREAD,tid,time查询进程中哪个线程的cpu占用率高 记住TID 3.使用jstack命令打印步骤1对应进程下的线程日志 jstack PID>> xxx.log 也可以使用jmap命令导出当前进程的 dump日志 jmap -dump:format=b,live,file=文件名PID,文件名可以使txt,bin,hprof等 导出的hprof文件可以用MAT等...
2021-08-10 14:07:49
1402
原创 JVM垃圾回收对象的引用类型
强引用 一般的Object obj = new Object().就属于强引用 (如果有GCRoot的强引用)垃圾回收器绝对不会回收它,当内存不足时宁愿抛出OOM错误,使得程序异常停止,也不会回收强引用的对象。 软引用 垃圾回收器在内存充足的时候不会回收它,而在内存不足时会回收它。 软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容时可以被释放的。 一些有用但是并非必需,用软引用关联的对象,系统将要发生OOM之前,这些对象就会被回收。 例如,一个程序用来处理用户提供的图片。如果将所有
2021-08-10 13:22:51
153
原创 jvm的内存溢出与内存泄漏
内存溢出 内存溢出的原因:程序在申请内存时,没有足够的内存空间 栈溢出 方法死循环递归调用(StackOverflowError)、不断建立线程,多个线程同时在跑(OutOfMemoryError) /** * 1M *5000线程同时在跑 =5G 内存小于5G */ public class StackOverFlow { public void test(){ test();//死递归 } public static void main(Stri
2021-08-09 18:25:17
172
原创 Java类加载机制与类加载器(双亲委派模型)
类加载机制 概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、 初始化(Initialization)、使用(Using)和卸载(Unloading)[gc回收]7 个阶段。其中验证、准备、解析 3 个部分统称为连接(Linking) 初始化 什么情况下会进行初始化 初始化阶段,虚拟机规范则是严格规定了有且只有 5 种情况必须立即对类进行“初始化”(
2021-08-06 17:09:39
237
原创 JVM垃圾回收器
判断对象的存活 引用计数法 给对象添加一个引用计数器,当对象增加一个引用时计数器加1,引用失效时计数器减1.引用计数为0的对象可被回收。(python在用,但主流虚拟机没有使用) 优点 快、方便、实现简单 缺陷 对象互相引用时(A.instance=B 同时 B.instance=A),很难判断对象是否该回收 可达性分析(Java中使用) 来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为 引用链(R
2021-08-05 16:20:47
143
原创 JVM垃圾回收算法
复制算法(copying) 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使 用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可, 实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。 注意:内存移动是必须实打实的移动(复制),不能使用指针玩。 优点 1.简单高效,不会出现内存碎片问题 缺点 1.内存利用率
2021-08-05 10:51:30
118
原创 synchronized锁的内存语义
1.当线程释放锁时,JMM会把该线程对应的本地内存中共享变量刷新到主内存中。 2.当线程获取锁时,JMM会把线程对应内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。 ...
2021-08-03 14:59:35
98
原创 volatile的可见性与原子性
可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量的读写具有原子性,但类似于volatile++这种复合操作不具有原子性。
2021-08-03 13:41:42
226
原创 volatile的实现原理
通过查看OpenJDK中unsafe.cpp的源码,会发现被volatile关键字修饰的变量会存在一个"lock."的前缀,这个前缀不是一种内存屏障,但是它能完成类似内存屏障的功能,Lock会对CPU总线和高速缓存加锁,可以理解为CPU指令级的一种锁。 同时改指令会将当前处理器缓存行的数据直接写回到系统内存中,且这个写回内存的操作回使在其他CPU里缓存了该地址的数据无效。 在具体的执行上,它先对总线和缓存加锁,然后执行后面的指令,最后释放锁后会把高速公路缓...
2021-08-03 13:16:35
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人