深入理解Java虚拟机-阅读整理
发表于|更新于|JVM
|浏览量:
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Xmind.html
看完《深入理解Java虚拟机》了(好像是教这个名字吧😂),花了小
几个月边看边整理,终于呕心沥血地整理完的,书籍作者基于jdk7写的,加入分析对比了一些jdk8的新特性,以及官方文献的引用,因为JVM还是比较底层灰色,难免有些地方可能有误,欢迎指正。图片很大,需要放大看,实在看不清,可以去github上自取源Xmind文件:点这里跳转
(有一章类结构偷懒没看,自我感觉用处不是很大)

文章作者: 花火
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花火笔记!
相关推荐

2019-02-16
JVM内存结构-总纲
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Memory-Structure-Menu.html 学习JVM的可以去我的GitHub 上查看我的Xmind详细笔记 对整本《深入理解JVM》都有详尽的笔记,帮助理解 前言 网上有不少描述JVM内存结构的文章,但是要么比较老久了,要么描述有误,今天根据自己的理解整理下,有误请指正。 整体图解 程序计数器 记录Java程序运行到哪里 线程私有,可以看做当前线程执行到哪行【字节码】 字节码解析器工作就是通过改变这个【计数器】来选择下一行要执行什么,分支、循环、线程恢复都依赖于它 若为Java方法,则记录当前执行的字节码指令地址; 若执行的是native方法,则为空 Java 虚拟机栈 描述java【方法】执行的【内存模型】 每个方法对应一个栈帧,在线程运行到该方法时才创建 一条线程拥有的栈帧之和最大为-Xss(我们这里把它叫做线程栈) 当前所有线程栈之和=当前Java虚拟机栈已用大小 Java虚拟机栈总空间最大值:JVM...
2021-08-10
报表JVM调优
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/report-jvm-optimize.html 忘记记录了。。凭记忆记录下😂,下面是大概流程 背景 之前上线的一个新报表项目,我们的报表服务主要通过定时任务异步生成报表,报表比较大,每次运行时长长,实时性要求较低。 但在生产环境普罗米修斯监控中,发现服务频繁进行GC,且GC前后释放的内存不多,GC期间CPU占用略高。但是GC时长看着很短,为了解决这个问题,我进行了一次针对报表服务的JVM调优 过程 1. 看监控 使用Prometheus监控JVM指标,并结合Grafana进行数据可视化。通过Prometheus收集报表服务的JVM指标,如GC情况、内存使用、线程状态等 发现回收间隔时间较短,且回收前后大部分时候释放的内存不是特别多,但有时候却特别多,看了下GC配置,G1+默认200ms的回收间隔,估计是这个时间间隔搞个鬼,不太适合我们的业务场景(报表比较大,每次运行时长长)。 2. jstat确认GC前后内存变化 1jstat -gc 12345 1000 ...

2021-08-11
垃圾回收器选型
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/jvm-gc.html 总揽 吞吐量和最短停顿时间本来就互相矛盾 Parallel Old追求的是吞吐量,CMS追求的是STW的最短 而G1通过把堆分成多个相对独立的Region块,并行的进行选择性的回收,实现一个两者兼顾的回收器 Parallel GC: 适用于吞吐量优先的场景 原理: 通过参数-XX:GCTimeRatio 设置垃圾回收时间占总时间的比例,默认值为99,即垃圾回收时间不超过1%,实现吞吐量优先 CMS(Concurrent Mark Sweep)GC: 适用于响应时间优先的场景 原理1:通过-XX:CMSInitiatingOccupancyFraction预留空间实现一边回收垃圾,一边执行业务逻辑,实现响应时间优先 原理2:通过并发标记等,实现尽可能低的停顿 缺点1: 内存使用率低,为了一边干活一边回收垃圾,预留了一定的内存 缺点2:产生碎片,虽然FullGC时候,但是运行期间会产生大量碎片 (新增)G1(Garbage...

2019-02-19
java虚拟机栈的内存结构
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Memory-Structure-Stack.html 学习JVM的可以去我的GitHub 上查看我的Xmind详细笔记 对整本《深入理解JVM》都有详尽的笔记,帮助理解 一、 前言 Java栈分为两种: Java虚拟机栈: 描述java【方法】执行的【内存模型】 每个线程进入每个方法对应一个栈帧 本地方法栈(本文不做描述) 同虚拟机栈,区别在于:虚拟机栈服务于Java方法(字节码),本地方法栈服务于Native方法 本文主要讲Java虚拟机栈的内存结构 一图胜千言 二、Java虚拟机栈的组成: 1. 栈帧 每个方法对应一个栈帧,在线程运行到该方法时才创建,随着方法结束而销毁 2. 线程栈 栈帧内存在线程内存上进行分配,每条线程能为栈帧分配的总大小最大值为-Xss 为了方便,我们这里 [把这条线程对应的内存] 称为 [线程栈] 3. Java虚拟机栈 Java虚拟机栈是描述java【方法】执行的【内存模...
2020-10-18
Java I/O模型与系统I/O模型
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/IO-model2.html 接: IO模型 Java I/O模型与系统I/O模型的映射关系 Java的I/O模型是建立在底层系统I/O模型之上的,它通过对底层系统I/O调用的封装,提供了更高层次的抽象和统一的I/O接口。Java的I/O类库支持的I/O模型和底层系统I/O模型之间的映射关系如下: 阻塞式I/O模型 Java的I/O类库默认使用阻塞式I/O模型。在该模型下,I/O操作会一直阻塞,直到数据准备好或者操作完成才返回。对应的系统I/O模型是传统的阻塞式I/O模型。主要对应的系统I/O模型是Linux系统中的read(), write() 这里主要是各种Stream、Reader、Writer、Socket的读写,其中Socket为: 1234567891011121314ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();// 监听 8080 端口进来的 TC...
2017-04-19
HashMap-JDK1.8
参考链接:HashMap在JDK1.8之前和之后的区别 JDK1.8之前 new HashMap(n)中的n为其容量 元素插入使用头插法 并发插入(resize时)会产生循环链表,在get一个不存在的元素时会导致死循环。参考:Java HashMap的死循环 JDK1.8之后 元素使用尾插法 new HashMap(n)中的n最接近的2^m为其容量 并发插入还是有问题,但不会产生死循环 插入时数组长度>64,桶元素>8时,会树型化 发生resize时,resize后,桶元素个数<=6的,都会被解树型化 取模用与操作(hash & (arrayLength-1))会比较快,所以数组的大小永远是2的N次方。你随便给一个初始值比如17会转为32 resize实现逻辑参考:Java HashMap工作原理及实现 HashMap关于static final int UNTREEIFY_THRESHOLD = 6的分析 遍历整个原始桶,把桶内数据分配到原桶与新桶中 具体图解分析可以参考以下链接的第六点:Java HashMap工作原理及实现 判断新桶元...
公告
This is my Blog

