![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 84
LCB2018
这个作者很懒,什么都没留下…
展开
-
Java方法调用
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调 用哪一个方法),暂时不涉及方法内部的具体执行过程。原创 2022-11-09 11:36:29 · 1613 阅读 · 0 评论 -
Java字节码执行引擎——运行时栈帧结构
虚拟机的执行引擎不是直接建立在处理器、硬件、指令集和操作系统层面的,而是由自己实 现的,因此可以自行制定指令集与执行引擎的结构体系,并能够执行哪些不被硬件直接支持 的指令集格式。在不同的虚拟机实现里面,执行引擎在执行 Java 代码的时候可能会有解释执行和编译执行 (通过即时编译器产生本地代码)两种选择,也可能两者兼备。但从外观上看起来,所有的 Java 虚拟机都是一样的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出 的是执行过程。原创 2022-11-05 15:55:08 · 599 阅读 · 0 评论 -
Java类加载器(双亲委派模型)
类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为类加载器。原创 2022-11-03 11:34:32 · 215 阅读 · 0 评论 -
Java类加载的过程
开发人员可以通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的findClass()或loadClass()方法),实现根据自己的想法来赋予应用程序获取运行代码的动态性。对于数组而言,数组类本身不通过类加载器创建,它是由Java虚拟机直接在内存中动态构造出来的。原创 2022-11-02 17:11:53 · 133 阅读 · 0 评论 -
类加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化, 最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。与那些编译时需要进行连接的语言不同,Java 语言里面,类型的加载、连接和初始化都是在程序运行期间完成的,这种策略虽然会令类加载时增加一些性能开销,但是是为 Java 应 用程序提供高度的灵活性,Java 里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。原创 2022-11-02 15:09:13 · 53 阅读 · 0 评论 -
经典垃圾收集器(三)
虽然Shenandoah也是基于Region的堆内存布局,同样有着用于存放大对象的Humongous Region,默认策略也是优先处理回收价值最大的Region,但是在堆内存管理上,它与G1至少有着三个明显的不同之处,最重要的是支持并发的整理算法,G1的回收阶段是可以多线程并行的,但却不能与用户线程并发。ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。原创 2022-10-27 14:33:42 · 350 阅读 · 0 评论 -
经典垃圾收集器(二)
它⾮常符合在注重⽤户体验的应⽤上使⽤。从名字中的这两个词可以看出,CMS 收集器是⼀种 “”算法实现的,它的 运作过程相⽐于前⾯⼏种垃圾收集器来说更加复杂⼀些。初始标记(CMS initial mark)和重新标记(CMS remark)仍然需要“Stop The World”。从整体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。原创 2022-10-26 17:24:58 · 125 阅读 · 0 评论 -
经典的垃圾收集器(一)
如果说收集算法是内存回收的⽅法论,那么垃圾收集器就是内存回收的具体实现。原创 2022-10-26 15:08:03 · 100 阅读 · 0 评论 -
HoptSpot的算法细节实现(三)
写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知,供程序执行额外的动作,即赋值的前后都在写屏障的覆盖范围内。应用写屏障后,虚拟机就会为所有赋值操作生成相应的指令,一旦收集器在写屏障中增加了更新卡表操作,无论更新的是不是老年代对新生代对象的引用,每次只要只要对引用进行更新,就会产生额外的开销,不过这个开销与Minor GC时扫描整个老年代的代价相比还是低很多。除了写屏障的开销外,卡表在高并发场景下还面临着。原创 2022-10-24 16:20:13 · 248 阅读 · 0 评论 -
HoptSpot的算法细节实现(二)
(上面代码使用的卡页是2的9次方幂),如果CARD_TABLE的第0、1、2号元素分别对应地址范围为0x000-0x01FF、0x0200-0x03FF、0x0400-0x05FF的卡页内存块。一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素值标识为1,称这个元素变脏(Dirty),没有则0.在垃圾收集发生时,只要帅选出卡表中变脏的元素,就能轻易得出哪些卡页内存中包含跨代指针,把它们加入GC Roots中一并扫描。原创 2022-10-23 16:42:33 · 179 阅读 · 0 评论 -
HotSpot的算法细节实现(一)
不需要线程的执行代码主动去配合,在垃圾收集发生时,系统首先把所有用户线程全部中断,如果发现用户线程中断的位置不在安全点上,就恢复这条线程执行,让他一会再重新中断,直到跑到安全点上。当垃圾收集需要中断线程的时候 ,不直接对线程操作,仅仅简单设置一个标志位,各个线程执行过程时会不停的主动轮询这个标志,一旦发现中断标志位真时就自己在最近的安全点上主动中断挂起。迄今为止,所有的收集器在根节点枚举这一步骤时都必须暂停用户线程的,因此根节点枚举与整理内存碎片一样都会面临相似的“StopThe World”的困恼。原创 2022-10-23 15:26:29 · 241 阅读 · 0 评论 -
JVM垃圾回收算法
针对 HotSpot VM 的实现,它⾥⾯的 GC 其实准确分类只有两⼤种:部分收集 (Partial GC):目标不是完整的收集整个Java堆的收集。新⽣代收集(Minor GC / Young GC):只对新⽣代进⾏垃圾收集;⽼年代收集(Major GC / Old GC):只对⽼年代进⾏垃圾收集。需要注意的是 Major GC 在 有的语境中也⽤于指代整堆收集;混合收集(Mixed GC):对整个新⽣代和部分⽼年代进⾏垃圾收集。整堆收集 (Full GC):收集整个 Java 堆和⽅法区。原创 2022-10-21 15:05:03 · 103 阅读 · 0 评论 -
JVM判断对象是否存活
Java邻域,至少在主流的Java虚拟机里面都没有选用引用技术法来管理内存,主要原因是:这个看似简单的算法有很多例外的情况需要考虑,必须要大量配合额外的处理才能保证正确的工作。如单纯的引用很难解决对象之间循环引用的问题。原创 2022-10-19 14:54:33 · 169 阅读 · 0 评论 -
对象的内存布局以及访问定位
此外,如果对象是一个Java数组,那对象头中氦必须有一块用于记录数组长度的数据,因为数据的长度是不确定的,将无法通过元数据中的信息判断出数组的大小。对象需要存储的运行时数据很多,其实已经超过了32、64位Bitmap结构所能记录的最大限度,但对象头里的信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个有着动态定义的数据结构,以便在极小的空间存储尽可能多的数据,根据对象的状态复用自己的存储空间。对象的访问⽅式有虚拟机实现⽽定,⽬前主流的访问⽅式有。原创 2022-10-18 17:40:21 · 180 阅读 · 0 评论 -
Java对象创建过程
Java是一门面向对象语言,Java程序运行过程中无时无刻都有对象被创建出来。**类加载检** 1. 当Java虚拟机遇到一条字节码new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。(类加载过程?待更新)原创 2022-10-17 10:59:36 · 205 阅读 · 0 评论 -
Java运行时数据区域
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来。------------------------------------------------------------摘自《深入理解Java虚拟机》周志明Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。原创 2022-10-16 20:14:33 · 177 阅读 · 0 评论