这是关于JVM的第六篇文章,前面写了五篇关于JVM的文章,都是一层一层带着大家来深入的认识JVM,关于JVM的基本用到的知识都讲解过了。
那么这一篇文章将作为JVM的最后一篇,有总结,也有补充还没有提及到的知识点。
首先,关于JVM的开门篇,关于如何阅读深入JVM虚拟机第三版的文章:[如何三天啃下《深入JVM虚拟机第三版》],主要是分享个人阅读这本神书的经验,在文章里面划重点,吸收到我们自己所需要的知识点。
然后,是很久之前写的第二篇关于JVM的运行时数据区以及GC的算法篇:[还在学JVM?我都帮你总结好了(附脑图)] 。
这篇是是作为理论的重点部分,因为这片关于JVM的运行时数据区的各个部分是干嘛的,以及重点JVM堆的分代理论和GC的基本回收算法,都是为后面的Java堆的调优实战做铺垫。
然后是第三篇也是调优的重中之重,主要聊的就是GC:[你是不是垃圾,心里没点数吗?] ,如何判断一个对象是否存活、以及常见的GC的种类,常见GC年轻代和老年代的搭配,各种GC的原理和特点、以及适用的场景,在文章中都有提及到。
有了第二篇运行时数据区和第三篇GC的理论基础后,然后第四篇的JVM调优实战篇一:[JVM调优实战篇一] ,这一篇主要是围绕着JVM调优实战讲解的工具篇,包括线上的Arthas工具、GUI工具(Visual VM)、内存分析工具(mat)以及linux的原始命令jps、jstack、jstat、jmap、jhat等命令的讲解和使用。
熟悉了JVM调优的工具后,第五篇就是就是最后实战调优的场景、案例、经典排查OOM、磁盘不足排查、CPU飙高的排查、死锁的排查、调优的目的和理论已经调优案例场景解析:[JVM性能调优实战篇(二)]
其中,第五篇也是写了我最久的一篇,也是干货非常多的一篇,也是目的性最强的一篇,学习JVM就是为了调优,同时也收获不少的新读者的关注。
所以,按照上面帮你们排好的顺序,一篇一篇的往下读,应该对你的调优的技术和理论的深入认识应该是有所帮助的。
然后,自己有时间的话,也可以自己深入的啃啃《深入JVM虚拟机第三版》,关于JVM的其他书籍,我推荐:《Java虚拟机规范》、《垃圾回收算法手册:自动内存管理的艺术》、《Virtual Machines: Versatile Platforms for System and Processes》 这几本好书,有时间和能力的都可以去看一看。
最后,这是最后一篇也是第六篇,对于JVM虚拟机我们所需要的部分,还有一块就是类加载子系统还没有讲解,所以为了文章的完整性,这一补充JVM的类加载子系统,这一篇还是主要是理论。
首先,我们来聊一聊JVM的类加载子系统,我们知道我们的代码敲完后是.java类,然后经过编译就会变成.class类型的字节码文件。
这些.class类型的字节码文件经过类加载系统加载到JVM的内存中来供我们使用,这些文件我们也成为了元数据。
下面我画了一张图来大概一个类被类加载系统加载的过程,供大家理解:
就这样一个java类经过上面层层的过程来到了我们的JVM的虚拟机中,首先在加载过程的.class文件可以来源终于下面几个方面:
当由我们的类加载子系统完成了类加载后,这部分信息(包括类信息、常量、静态变量、方法信息等)就会存在方法区的内存中(jdk 7以及以前,jdk 8及以上移动到元空间,本地内存中),然后由JVM的执行引擎来执行。
在这个过程类加载的过程就好像扮演着中间人的角色,目的为的是JVM的执行引擎能够执行这些类:.class -> JVM -> 元数据模板 -> 实例对象。
那么,JVM在加载类的时候,这个过程的主角类加载器,又是怎么工作的呢?下面我们来聊一聊类加载器。
在JVM中经典的类加载器分为如下三层:
除了上面的经典三层还有一个就是用户自定义类加载器(User ClassLoader),它可以在程序中加载自己需要的类,所以完整的JVM类加载器如下图所示:
他们的关系并不是继承的关系,而是通常以组合的关系来复用父类加载器的代码。
我们了解完各种类加载器后,接下来详细的了解类加载的过程,一个完整的类加载过程主要包括一下几个阶段:加载-> 验证->准备->解析->初始化。
加载阶段是通过类的全类名,然后通过类加载器将class文件的二进制字节流转化为运行时数据区的方法区中。
并且,会在内存中生成一个java.lang.Class对象,作为这个类的各种数据的访问入口。
验证阶段既是验证字节码class文件中的字节码是否服务规范,保证里面的字节码不会对JVM自身造成伤害。
准备阶段既是为类中的类变量(static修饰的变量,但没有被final修饰一起修饰)分配内存以及初始化类变量的零值,这里并不包括实例变量,实例变量是在对象一起分配在Java堆中。
所谓的零值也就是数据的默认初始值,比如int为0,boolean默认为false,float默认为0.0f,引用类型的默认为null。
解析阶段的作用是将虚拟机内的常量池的符号引用替换为直接引用的过程。所谓的符号引用就是可以是任何形式的字面量,只要能够定位到目标即可;而直接引用可以是指向目标的指针、相对偏移量间接定位到目标的句柄。
最后是初始化,初始化是类加载的最后一个阶段,也是在这个阶段,Java虚拟机才真正开始执行类中的Java程序代码。
上面说到在准备阶段变量已经初始化一次零值了,那么在这一阶段才会将变量初始化为程序代码中主观设置的值。
对于这一部分,我之前也写过一篇详细的,所以这里做一个大概的介绍,详细的可以参考这一篇文章:[面试官:你知道java类是怎么跑起来的吗?问的我一脸懵]
双亲委派原则是各种加载器之前的一种工作方式,它目的是为了实现更加高效的进行类的加载。
当一个类加载器收到加载类的请求时,不会自己去尝试先加载该类,而是把该加载请求委托给父类,若是没有父类就是直接找顶层类加载器,若是有父类,并且父类还有父类加载器,依次向上委托,直到上面的所有父类都无法完成加载是,才会自己去加载,若是加载失败就会抛出异常。
它的好处就是加载一个类时,不用重复加载,当父类已经加载了,就不用加载第二年份,保证内存中只有一份。
我们来看看双亲委派实现的源代码,它的源代码主要实现是java.lang.ClassLoader的loadClass() 方法中:
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
// 检查该类是否已经被加载过了
Class c = findLoadedClass(name);
// c为null没有被加载过,则使用双亲委派原则进行类加载
if (c == null) {
try {
// 存在父类加载器
if (parent != null) {
c = parent.loadClass(name, false);
} else {
// 不存在服务加载器,则直接使用顶层类加载器进行加载
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// 父类加载抛出异常,说明父类无法完成加载
}
if (c == null) {
// 父类无法完成加载,则尝试自己去完成加载动作
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
好了,这一篇文章是的主要内容也讲完了,文字比较短,没有像以前那样基本都是万字,因为主要的内容都已经讲完了,这一篇还是比较简单的,更加倾向于对以前写的JVM的文章的总结。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/skFVFzIzXr1-tqcmsjYneQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。