大厂学苑-JVM
文章平均质量分 96
xiejunxing
这个作者很懒,什么都没留下…
展开
-
Java中的动态链接VS操作系统动态链接
在操作系统OS中为了优化内存的使用会采用一种动态链接方式,一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系。原创 2023-06-13 10:32:43 · 651 阅读 · 0 评论 -
JVM系列-第12章-垃圾回收器
垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。那么,Java常见的垃圾收集器有哪些?截止JDK1.8,一共有7款不同的垃圾收集器。每一款的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器(重点记忆图)。原创 2023-05-24 09:21:09 · 2121 阅读 · 0 评论 -
JVM系列-第11章-垃圾回收相关概念
1、一般的垃圾回收算法至少会划分出两个年代,年轻代和老年代。但是单纯的分代理论在垃圾回收的时候存在一个巨大的缺陷:为了找到年轻代中的存活对象,却不得不遍历整个老年代,反过来也是一样的。2、如果我们从年轻代开始遍历,那么可以断定N, S, P, Q都是存活对象。但是,V却不会被认为是存活对象,其占据的内存会被回收了。这就是一个惊天的大漏洞!因为U本身是老年代对象,而且有外部引用指向它,也就是说U是存活对象,而U指向了V,也就是说V也应该是存活对象才是!而这都是因为我们只遍历年轻代对象!原创 2023-05-22 09:48:39 · 559 阅读 · 1 评论 -
JVM系列-第10章-垃圾回收概述和相关算法(JVisualVM)
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。十几年前磁盘碎片整理的日子。原创 2023-05-19 13:45:07 · 499 阅读 · 0 评论 -
JVM系列-第9章-StringTable(字符串常量池)
String被声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义了用于存储字符串数据。JDK9时改为byte[]原创 2023-05-16 09:59:16 · 423 阅读 · 0 评论 -
JVM系列-第8章-执行引擎
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。(没有明白,感觉两个是一样的东西?(我的理解:解释器是把源码解释成执行引擎能识别的指令(和操作系统能执行的指令还是有区别的),及时编译器是直接把源码编译成操作系统能执行的指令,我理解对了没有。。。原创 2023-05-12 09:26:15 · 602 阅读 · 0 评论 -
JVM系列-第7章-对象的实例化内存布局与访问定位
① 加载类元信息 - ② 为对象分配内存 - ③ 处理并发问题 - ④ 属性的默认初始化(零值初始化) ⑤ 设置对象头的信息 - ⑥ 属性的显式初始化、代码块中初始化、构造器中初始化① 属性的默认初始化 - ② 显式初始化 - ③ 代码块中初始化 - ④ 构造器中初始化从字节码角度看 init 方法/*** 测试对象实例化的过程* ① 加载类元信息 - ② 为对象分配内存 - ③ 处理并发问题 - ④ 属性的默认初始化(零值初始化)原创 2023-05-11 09:16:51 · 390 阅读 · 0 评论 -
JVM系列-第6章-方法区
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区/*** 查看直接内存的占用与释放。原创 2023-05-10 09:34:43 · 680 阅读 · 0 评论 -
JVM系列-第5章-堆(JVisualVM)
从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。据我所知所有OpenJDK衍生出来的JVM都提供了TLAB的设计。1、每个线程都有一个TLAB空间2、当一个线程的TLAB存满时,可以使用公共区域(蓝色)的。原创 2023-05-08 09:19:30 · 1272 阅读 · 0 评论 -
第4章-虚拟机栈(多使用到jclasslib工具查看字节码)
栈顶缓存技术:Top Of Stack Cashing前面提过,基于栈式架构的虚拟机所使用的零地址指令更加紧凑,但完成一项操作的时候必然需要使用更多的入栈和出栈指令,这同时也就意味着将需要更多的指令分派(instruction dispatch)次数(也就是你会发现指令很多)和导致内存读/写次数多,效率不高。由于操作数是存储在内存中的,因此频繁地执行内存读/写操作必然会影响执行速度。为了解决这个问题,HotSpot JVM的设计者们提出了栈顶缓存(Tos,Top-of-Stack Cashing)技术,原创 2023-05-04 10:07:13 · 446 阅读 · 0 评论 -
第3章-运行时数据区
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区加载 --> 链接–> 初始化类比一下也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。原创 2023-04-25 09:51:27 · 424 阅读 · 0 评论 -
第2章-类加载子系统
英文版中文版注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎System . out . println("你的大恩大德,我下辈子再报!");} }它的加载过程是怎么样的呢?执行 main() 方法(静态方法)就需要先加载main方法所在类 HelloLoader加载成功,则进行链接、初始化等操作。完成后调用 HelloLoader 类中的静态方法 main加载失败则抛出异常。原创 2023-04-23 10:07:18 · 410 阅读 · 0 评论 -
第1章-JVM与Java体系结构
你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了。每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。大部分Java开发人员,除了会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。原创 2023-04-14 09:16:50 · 447 阅读 · 0 评论