jvm
文章平均质量分 93
a_ittle_pan
A coder who likes open source, has worked in the field of network security and Android, and is now constantly exploring ing in the field of java
展开
-
JVM垃圾回收系列之垃圾收集器二
G1(Garbage First)是一款面向服务器应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特性。在JDK1.7版本正式启用,移除了Experimental标识,是JDK 9以后的默认垃圾回收器,取代了CMS回收器以及Parallel+ParallelOld组合。被Oracle官方称为“全功能的垃圾收集器”。与此同时,CMS已经在JDK 9中被标记为废弃(deprecated)。原创 2022-11-06 21:20:18 · 408 阅读 · 5 评论 -
JVM垃圾回收系列之垃圾收集器一
现在都不是单核的了。看上图,大家可能会有一个问题,为什么虚拟机提供了这么多的垃圾收集器,那这里需要大家明确一个观点:虽然我们是在对各个收集器进行比较,但并非为了挑选出一个最好的收集器,因为直到现在为止还没有最好的收集器出现,更加没有万能的收集器,所以我们选择的只是对具体应用最合适的收集器。这个收集器是一个单线程的收集器,但它的“单线程”的意义不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它进行垃圾收集时,必须暂停其他所有的工作线程,知道它收集结束(Stop The World)原创 2022-10-30 18:54:46 · 1215 阅读 · 9 评论 -
JVM垃圾回收系列之GCRoot算法实现
在 HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的 时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也 会在特定的位置记录下栈和寄存器中哪些位置是引用。在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,但一个很现实的问题随之而来:可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将会变得很高。原创 2022-10-09 13:10:01 · 851 阅读 · 10 评论 -
JVM垃圾回收系列之垃圾收集算法
现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor[1]。为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块(也就是堆内存中的两个survivor区,在以前的堆系列文章中有过介绍)。依次反复,直到垃圾收集完成。原创 2022-09-25 17:03:38 · 755 阅读 · 12 评论 -
JVM垃圾回收系列之对象垃圾判别
以常量池中字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc”的,换句话说,就是没有任何 String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量,如果这时发生内存回收,而且必要的话,这个“abc”常量就会被系统清理出常量池。在每个java对象中都有引用计数器,这个计数器的作用是每当有一个引用指向这个对象,那么这个计数器就会加一,反之,每减少一个引用指向这个对象,这个计数器就会减一。判定效率高,回收没有延迟性。原创 2022-09-12 12:38:46 · 204 阅读 · 13 评论 -
JVM系列之语法糖的味道
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java语言来说,ArrayList< int >与ArrayList< String >就是同一个类,所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。......原创 2022-08-28 16:32:18 · 467 阅读 · 13 评论 -
JVM系列之synchronized锁优化
每年“金三银四、金九银十”都是投简历的好时机,博主会在这些阶段去投递简历,看看市面上的互联网公司的要求,再调整自己技术栈学习的顺序,在最近的投递的互联网公司(包含一线、超一线、中小型)对于java开发岗位的要求基本离不开“分布式/微服务开发”、“精通java”、“jvm”、“sql调优”、“常见中间件”、“springboot开发”、“算法和数据结构”、“计算机网络”。看了这些个要求,内心浮现出了几个大字:“我顶你个肺”生活还是要继续,抱怨完就业情形,我嘎嘎就更新了jvm系列文章参考书籍:“深入理解Jav原创 2022-08-15 10:09:52 · 523 阅读 · 12 评论 -
JVM系列之java虚拟机与线程
“少年读书,如隙中窥月;中年读书,如庭中望月;老年读书,如台上玩月。皆以阅历之深浅,为所得之深浅耳”参考书籍:“深入理解Java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址线程出现的场合一般都会有数据并发安全,而如何保证数据并发安全又是java程序员必备的一项技能,今天这篇文章我们就从java虚拟机的角度去了解线程的底层原理。let’s go!!我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既原创 2022-08-08 09:00:00 · 447 阅读 · 9 评论 -
JVM内存模型之深究模型特征
“人生当自强,人的一生,总会遇见挫折磨难,但人生没有过不去的坎,走过了,便是一种收获,便会让自己成长起来”参考书籍:“深入理解Java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址Java内存模型要求lock、unlock、read、load、assign、use、store、write这8个操作都具有原子性,但是对于64位的数据类型(long和double),在模型中特别定义了一条相对宽松的 规定:允许虚拟机将没有被volatile修饰的64位数据的读写原创 2022-07-30 15:05:09 · 262 阅读 · 7 评论 -
JVM内存模型之Volatile关键字
当一个变量定义为Volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。总结地说就是volatile变量在各个线程的工作内存中不存在一致性问题(在各个线程的工作内存中,volatile变量也可以存在不一致的情况,但由于每次使用之前都要先刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性问题),但是Java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的。...原创 2022-07-24 10:53:23 · 269 阅读 · 11 评论 -
JVM内存模型系列之初探内存模型与线程
开心周末配上JVM系列文章更加的美味!🇨🇳🇨🇳🇨🇳🇨🇳(^ω^)原创 2022-07-09 11:42:56 · 414 阅读 · 8 评论 -
JVM系列之对象的创建
“学而不厌,诲人不倦”参考书籍:“深入理解java虚拟机”个人java知识分享项目——gitee地址个人java知识分享项目——github地址案例代码:反编译(javap -c ApplicationContextStarter.class)得到的结果:通过案例去解析整个对象的创建过程,分析main方法中的字节码指令(ApplicationContextStarter()是构造器方法,我们这里不去过多关注):1.当java虚拟机遇到字节码new指令时,首先会去检查这个指令的参数是否能在常量池(方法区)原创 2022-07-03 11:34:48 · 544 阅读 · 15 评论 -
JVM系列之对象深度探秘
jvm的内存布局深入解析原创 2022-06-26 10:23:49 · 450 阅读 · 14 评论 -
JVM系列之执行引擎
经典栏目如期而至。之前我们已经了解到了JVM的类加载过程和运行时内存区的基础相关内容,今天我们来了解“执行引擎”。参考书籍:“深入理解java虚拟机”JVM的主要任务是负责装载字节码到其内部,但字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅是一些能够被JVM所识别的字节码指令、符号表、以及其他辅助信息。那么,如果想要让一个java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台相应的本地机器指令才可以。简单来说,JVM的执行引擎充当了将高级语原创 2022-06-05 17:21:20 · 190 阅读 · 5 评论 -
JVM类加载系列之初始化过程
引言一星期一更的节目可能会迟到,但永远不会缺席!!!参考书籍:“深入理解java虚拟机”初始化(Initiallization)初始化阶段,简言之,为类的静态变量赋予正确的初始值。具体描述:类的初始化是类装载的最后一个阶段,如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中。此时,类才会开始执行Java字节码。(即:到了初始化阶段,才真正开始执行类中定义的Java程序代码。)初始化阶段的重要工作是执行类的初始化方法:clinit()方法该方法仅能由Java编译器生成并由JVM调原创 2022-04-25 20:21:38 · 946 阅读 · 11 评论 -
JVM运行时内存区系列之方法区
JVM运行时内存区系列之堆原创 2022-05-29 09:53:38 · 189 阅读 · 2 评论 -
JVM运行时内存区系列之栈
起步哟西,一星期一更的系列闪亮登场!参考书籍:“深入理解java虚拟机”经常有人把java内存区域笼统地划分为堆内存(Heap)和栈内存(Stack),这种划分方式直接继承自传统的C、C++程序的内存布局结构,在Java语言里就显得有些粗糙,实际的内存区域划分要比这更复杂。栈:线程独占的内存区域(按照线程划分内存区域的方式),它可以细分为程序计数器、Java虚拟机栈、本地方法栈这三块区域。程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可原创 2022-05-10 18:06:16 · 448 阅读 · 0 评论 -
JVM运行时内存区系列之堆
起笔今年的五一,大家可能无法领略到“优美逶迤”的山岭和享受“沁人心脾”的山间泉水。但是可以看到博主的“JVM系列的文章”也不算是虚度了五一嘛!(哈哈🎉🎉✨✨✨🎉✨大家五一节快乐!!!)参考书籍:“深入理解java虚拟机”Java堆Java堆是虚拟机所管理的内存中最大的一块,且所有的对象示例以及数组都应当在堆上分配Java堆是所有的线程共享的的一块内存区域,在虚拟机启动的时候创建。此内存区域的唯一目的就是存放对象示例。从垃圾回收的角度上来看,堆又可以细分为“新生代”(新生代中包含Eden区原创 2022-05-01 11:05:42 · 273 阅读 · 13 评论 -
JVM类加载系列之链接过程
起笔经过一个星期的面试,拿了几个offer,碰到了很多的面试官,感觉最好的是“泛微”。然后稍微总结一下面试官都会问的一个重点:javase的熟练程度 (集合、并发…)spring (IOC、AOP)数据库 (主要是索引和事务)redis(需要比较熟练)jvm(这块有些公司不会问很深入)上面的总结是我个人的一个面试过程总结,不适合所有人,毕竟每个人面试的公司不同,碰到的面试官不同,那么侧重点肯定就会不同(跟部门有关)上面中的几个重点内容中,我个人对于redis的内容是了解不够深入的,所以原创 2022-04-17 11:30:44 · 719 阅读 · 2 评论 -
JVM类加载机制系列之加载过程
引言最近在面试的过程中,很多稍微大一点的公司都会问你跟jvm有关的相关知识点,所以就想通过文章的形式将学习jvm的一些经验发表出来,对自己也算是一个复习的效果。参考书籍:“深入理解java虚拟机”虚拟机类加载机制java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载的时机一个类从被类加载器加载到虚拟机内存中,到卸载出内存中为止,它的整个生命周期会经历加载(Loading)、验证(Verification原创 2022-04-11 21:14:21 · 1194 阅读 · 2 评论