整理关于JVM方面的知识点

 
本周开发任务基本完成,整理下关于JVM方面的知识点

照顾下新来JE的同学,先发个链接到两位大牛的主页 
              http://rednaxelafx.iteye.com/
              http://icyfenix.iteye.com/ 

 

      目录

  •     1)概述
          2)编译           3)Class文件结构          4)通过ClassLoader加载Class           5)类执行机制           6)运行时数据区           7)垃圾回收相关            8)多线程           9)故障检测工具及命令           10)其他  

       1) 概述

            1.1) 引用一张官网的图阐明JDK、JRE、JVM、JIT的关系(如下图所示),我们可以看见JDK>JRE>JVM>JIT,JIT分为client模式和server模式两种,代码如果执行频率过高就会被JIT编译器转换成二进制执行,JVM是JAVA跨平台的依赖,JVM在不同平台中开辟一块属于自己的内存,独立运行自己的任务,JRE除了包含JVM以外,还包括SUN开发出来的接口与实现方便程序猿们利用JAVA语言开发,除了需要了解开放的部分Code以外,我们通常需要熟悉核心的API来满足我们开发的需求,JDK除了包含JRE还包括一些自带的命令,如将JAVA代码转换成class文件的javac命令、执行class文件的java命令、将注解变成API的javadoc命令、反编译javap、将java文件转换成jar包的jar命令,以及一些故障检测工具和命令等等.....     



 

 
                   1.2)  虚拟机的规范与实现,JAVA语言提供了虚拟机的规范,各大厂商提供了JVM的实现,目前我们使用最多的是原Sun的Hotspot虚拟机,提供JDK7的最新JVM规范http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf




 
 

                   1.3) JVM的标准结构,宏观认识下JVM的组成架构,如图




                     1.4) 一些疑问...

                           1.4.1 ) JAVA API已经封装的很好了,而且对象也不需要我们手动回收,为什么需要了解JVM方面知识?

                           个人看法:了解、熟悉JVM可以帮助我们在编码过程中注意内存分配、提高代码执行性能、保证并发量很高的时线程安全、合理的解决复杂的需求、调优、搭建应用服务器架构、服务器宕机、内存溢出时候可以快速让我们定位到问题并解决。

                                        1.4.2 ) 如何看待并学习JVM?

                            个人看法:和学习其他知识相同,掌握如何使用基础上要了解其原理,如果把JDK的API看成提供给用户的使用手册,那么JVM相关规范就是开发人员的文档,JVM方面知识有些杂、并且比较深,国内在R和F的带动下已经有很多同学意识到这方面的重要性,个人建议学习这方面知识点可以理论与实际相结合,循序渐进,当然我自己也是个才入门的新手 (*^__^*)  

        2)  编译

             JDK的编译实现是用JAVAC来实现的,如下图所示,编译过程是编译器如何优化是编译器和JAVAC考虑的问题,因此文档和学习资料也比较少。



 

           3)  Class文件结构

                 3.1)  Class文件结构包含什么?

                        1)  Class文件格式版本号

                        2)  类/继承癿超类/ 实现癿接口癿声明信息

                        3)  域和方法声明的信息

                        4)  常量池

                        5)  字节码

                        6)  异常处理表

                        7)  操作数栈与局部变量区的大小

                        8)  StackMapTable

                        9)  .....

                       3.2)  虚拟机规范支持的数据类型。如下图所示

 

 

                     3.3)  Class文件指令,如下图所示



对应的JAVA代码为


 

 

 

 

 

 

 

 test方法中对应指令解释

  0:iconst_0                //定义常量0,放入操作数栈 

  1:istore_1                //弹出栈顶放入局部变量区

  2:iload_1                 //将变量存入i中

  3:bipush 100           //将100放入操作数栈

  5:if_icmpge              //i与100比较

  8:getstatic               //获取静态方法

  11:i_load1               //加载变量i

  12:invokevirtual      //调用PrintStream对象的print方法输出i

  15:iinc  1,1              //将变量i自加

  18:goto 2               //跳转到第二行

   return                    //返回

 

                     3.4) 虚拟机字节码调用方法相关指令集

                   invokevirtual       调用普通方法

                   invokestatic        调用静态方法

                   invokespecial     调用构造方法

                   invokeinterface   调用接口的方法

                        invokedynamic(JDK7) 动态字节码指令 http://icyfenix.iteye.com/blog/1392441

       

    4) 通过ClassLoader加载Class

              4.1) ClassLoader的层次关系

 



 
启动:
jdk/lib目录
Xbootclasspath指定jar包
  系统:
classpath所指目录与jar包
Djava.class.path所指目录与jar包
 
  自定义:运行期ClassLoader子类动态加载class文件
 
 
扩展:jdk/lib/ext目录Djava.ext.dirs指定jar包


                  4.2) Class的链接

                           4.2.1) 校验Class,可能会抛出的异常

                                  1) 当不符合JVM的Class规范的时候会抛出来VeriftError异常

                                  2) 当引用类不存在的时候会出现NoClassDefFoundError异常

                                  3) 变量不存在的时候会出现NoSuchFiledError异常

                                  4) 方法不存在会出现NoSuchMethod异常

                    4.2.2) 在连接过程中会初始化静态变量

             4.3) Class的初始化时间

                    1) JVM指定初始化内容

                    2) new出来的对象

                    3) 反射

                    4)子类初始化

                    5) 调用对象的静态变量或者静态方法

                    6) .....

             4.4) 初始化内容

                     1) 静态代码块

                     2) 构造方法

                     3) 类变量

        5) 类执行的机制

           5.1) JVM有两种执行方式,分别为解释执行和编译执行,解释执行直接执行字节码文件,编译执行先将字节码转成机器码,然后再执行,编译执行的效率要比解释执行的高,通常当代码被编译的“热度”到一定程度后会变成编译执行。如下图所示

 

 
               5.2) 编译执行依赖于JIT编译器,JAVA为我们提供了Client模式和Server模式,Client模式做了少量的优化(方法内联、去虚拟化、冗余消除),Server的模式做了大量的优化(逃逸分析、标量替换、栈上分配、同步消除)

       6) 运行时数据区

           6.1)JAVA运行期内存如图所示

           

            6.2) 堆内存

                 6.2.1)堆内存包含什么?

                      堆内存中包括了新生区和养老区、新生区中包括了一块伊甸区和两块幸存者区,其中养老区和新生区的比例大概是4:1,可以通过-XX:NewRatio来设置比例大小,老年代中包含了CodeCache区域,对于调用比较频繁的空间会放入其中,新生区中的伊甸区默认情况下与幸存者区的大小比例为8:1:1,可以通过-XX:SurvivorRatio来设置其比例大小

                 6.2.2)堆内存的特性有什么?

                       堆内存是线程公有的

                 6.2.3)有可能会产生JavaHeapSpace异常的原因?

                       1)集合类对象太大

                       2)内存泄露

                       3)方法太长

                       4).....

           6.3) 虚拟机栈

                   6.3.1)栈与方法调用栈

                        每个方法都有一个方法调用栈,该栈不会与其他线程共享,每次调用一个方法的时候都会产生一个栈帧,每个栈帧包括局部变量区、操作数栈、常量的引用等等。

                   6.3.2)虚拟机栈为线程私有,每个用户请求都会对应至少一个线程响应

                   6.3.3)线程的大小通过-XSS来设置

                 6.3.4)如果循环太多会导致StackOverFlowError异常

            6.4) 方法区

                    6.4.1)方法区也线程共享的,主要存放的是Class文件信息,如果反射太多会出现PermSpaceError异常

       7)垃圾回收

         7.1)GC回收算法

             1)引用计数法,顾名思义,给每个对象加上一个计数器的属性,每有一个引用则将其加1,如果引用数量小于等于0则此对象可以回收

             2)标记清除算法,垃圾回收分两个阶段,第一次遍历标记对象可回收,第二次遍历进行GC,这样不好的地方会导致内存碎片

             3)复制算法,将内存等分,初次遍历将存活对象放入另外一块内存,之后将使用内存全部清除,这样不好的地方会引起内存浪费

             4)标记整理算法,将使用对象移向一端,之后清除全部其他对象,=

             5)目前JAVA虚拟机采用的大多数为年轻代分区使用复制算法,由于很多对象存活期很多,所以伊甸区和幸存者区的比例可以相差较大,养老区使用的是标记整理算法。

          7.2)垃圾回收器

             1)Serial收集器,单线程的收集器,特点简单高效、回收时候回停止服务

             2)ParNew收集器,Serial收集器的多线程版本

             3)ParallelScavenge收集器,采用复制算法的多线程收集器

             4)Serial Old收集器,Serial收集器的Old版本

             5)CMS收集器基于标记清除算法实现的,可以提供最短的停顿时间

 

        

                    未完待续

JVM高频面试基本问题与知识点整理 阅读详情

相关推荐

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1794

JVM知识点整理

看完《深入理解java虚拟机》后,稍微整理下知识点。

onlyusc2的博客 937

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1134

温故而知新--JVM知识点整理

小强的专栏 225

scanpy单细胞转录组python教程(四):单样本数据分析之降维聚类及细胞注释

本文介绍了使用scanpy进行单细胞转录组分析的降维聚类和细胞注释流程。首先通过PCA降维并可视化主成分贡献,然后使用不同分辨率参数(0.2-1.0)进行Leiden聚类。通过Wilcoxon检验鉴定marker基因,并基于经典marker基因手动注释细胞类型。最后对低质量细胞群进行过滤,并重新计算邻居图和UMAP可视化。流程中包含PCA方差分析、多分辨率聚类比较、marker基因筛选和基于UMAP的细胞类型可视化等关键步骤,为后续分析奠定基础。

qq_42090739的博客 941

INCA刷写App文件必看:A2l文件配置与ProF文件安装详解(2023最新版)

本文深入解析了使用INCA进行ECU应用程序刷写时,A2l文件配置与ProF文件安装的关键细节与避坑指南。重点阐述了A2l文件必须与待刷写二进制文件严格匹配的核心逻辑,以及ProF文件与Bootloader版本强相关的安装策略,帮助开发者解决刷写过程中的常见失败问题,确保刷写流程的稳定与可靠。

milk8的博客 591

Jvm知识点整理

在JDK 8及以后的版本中,永久代(PermGen)被元空间(Metaspace)所取代,但元空间并不属于堆内存,而是属于方法区(Method Area)的一部分。垃圾回收的主要目标:堆是垃圾收集器(GC)管理的主要目标,当堆中的对象不再被引用时,垃圾收集器会将其标记为可回收对象,并最终回收内存。启动时,根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。线程共享:堆内存是所有线程共享的,这意味着多个线程可以访问和操作堆中的对象。

qq_19297189的博客 1683

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 260

【JVM】JVM面试知识点整理

【JVM】JVM知识点整理1.JVM1.1 JVM概述2.JAVA内存区域2.1运行时数据区2.1.1 程序计数器2.1.2 虚拟机栈2.1.3 本地方法栈2.1.4 java堆2.1.5 方法区2.1.5.1 方法区2.1.5.2 运行时常量区2.1.6 直接内存2.1.7 Java8的元空间2.2 虚拟机对象2.2.1 对象的创建step1.类的加载step2.分配内存step3.初始化零值step4.设置对象头step5.执行Init方法2.2.2 对象的内存布局2.2.2.1 对象头2.2.2.2

罗伯司机的博客 449

模电仿真软件:MultSim14.3下载与安装

在setup文件夹中,找到【Install.exe】文件,然后右键单击选择【以管理员身份运行】(这一步超级重要,否则可能会出现权限不足导致安装失败)!解压完成后,打开解压出来的文件夹,找到并进入【setup】文件夹(这一步很重要,不要进错文件夹)。4、在弹出的安装向导中,仔细阅读许可协议后,选择【我接受】,然后点击【下一步】继续安装过程。首先我们需要将下载好的安装包解压到本地文件夹,确保有足够的磁盘空间(建议至少5GB以上)!按照安装向导的提示,点击【下一步】继续(保持默认设置即可,除非你有特殊需求)

weixin_44264994的博客 2329

ANSYS_APDL实战入门——从零开始掌握模态分析

本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。

egg99的博客 1130

JVM知识点整理(整理中)

运行过程:调用T.count时,首先将T.class通过app加载到内存,再经过Verification进行校验,之后再通过Preparation对T里面的静态成员变量赋默认值,此时t是空值,,count是0,再进行Resolution,之后再通过Initializing对静态成员变量赋初始值,此时t会被赋值new T(),对count++,此时count是1,之后count又被赋值为2,因此count为2。所用到的类库,会在class文件被加载到 JVM的同时,也被装载到类加载器中。

NewBeeMu的博客 2685

数据集FFHQ和LSUN介绍【包含FFHQ1024,515,256,128分辨率图像获取方法】

FFHQ全称Flickr-Faces-High-Quality(Flickr-Faces-HQ),最初是作为生成式对抗网络(GAN)的基准创建的,也用于StyleGAN的训练数据集中,并由英伟达于2019年开源。CVPR_2019Flickr-Faces-HQ (FFHQ)其由 70,000 张分辨率为 1024×1024 的高质量 PNG 图像组成,在年龄、种族和图像背景方面包含相当大的差异。它对眼镜、太阳镜、帽子等配饰也有很好的覆盖。

zik的博客 3980

JVM-知识点整理

JVM-知识点整理 文章目录JVM-知识点整理JVM内存结构Java堆(Heap)方法区(Method Area)程序计数器(Program Counter Register)JVM栈(JVM Stacks)本地方法栈(Native Method Stacks)垃圾收集算法对象存活判断标记 -清除算法复制算法标记-压缩算法分代收集算法垃圾收集器Serial收集器ParNew收集器Parallel收集器Parallel Old 收集器CMS收集器G1收集器内存划分G1 工作流程年轻代收集Old GC / 并发

qq_37012496的博客 742

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JVM知识点的整理

1、JVM的重要组成部分 1、类加载器 Java转换字节码 2、运行时数据区 把字节码加载到内存中 3、执行引擎 将字节码转换成为操作系统指令,交由CPU执行 4、本地库接口 执行过程可能调用其他语言的本地库接口 2、类的加载过程 1、加载(根据路径加载文件) 2、检查(检查文件是否正确) 3、准备 准备给类的静态变量在堆内分配内存空间,静态变量只初始化一次 4、**解析:**将常量池中的符号引用替换成直接引用,符号引用一个标识,直接引用可以理解为直接指向内存中的地址,常量池在元空间 5、初始化对静态变量

qq_42478982的博客 408

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JVM 知识点整理1

会出现(栈空间不足,无法容纳新栈帧)和OOM-Xss设置栈大小每个方法调用(native 方法除外)都会在 Java 栈中新建一个栈帧,一个栈帧对应一个方法。栈顶的栈帧称为当前栈帧,对应的方法称为当前方法。方法的执行就是栈帧入栈和出栈的过程。System.out.println("方法A开始执行");methodB();System.out.println("方法A执行完毕");System.out.println("方法B开始执行");methodC();

qq_45127802的博客 490

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jvm 知识点整理

最近想回顾下自己看的知识点。对它进行整理,查缺补漏。其中有错误的和不足地方,也希望各位提出。大家一起进步 其实对java的虚拟机之间的东西,自己很长时间其实是没有太怎么深入了解的。后面也是在面试中遇到面试的问题,自己才在之后。才去看了,了解。但是在看之后。确实感觉之间让人迷迷糊糊的。下面我就梳理下自己对jvm的理解。 1.jvm 的内存的的划分,主要是分为栈,堆着两大内存区域,但是其里面还有一些详细的划分,如图: 方法区:用来存储类的名称以及相关信息,想常量池也在此中 对象创建区:主要是new的

u014609066的博客 223

JVM面试知识点整理

1. 运行时数据区域 程序计数器(Program Counter Register) 这和计算机操作系统中的程序计数器类似,在计算机操作系统中程序计数器表示这个进程要执行的下个指令的地址,对于JVM中的程序计数器可以看做是当前线程所执行的字节码的行号指示器,每个线程都有一个程序计数器(这很好理解,每个线程都有在执行任务,如果线程切换后要能保证能恢复到正确的位置),重要的一点——程序计数器,...

snowbaby1234的博客 1509

JVM知识点整理复习

此次JVM知识点包含以下几个部分 1.类加载机制 2.jvm运行时数据区 3.java对象内存布局 4.jvm内存模型 5.垃圾回收机制 6.垃圾收集器 一 类加载机制 类加载流程如下

qq_34621188的博客 324
上一篇: 用Jvisualvm定位开发中的问题
下一篇: 运用JMX远程监控、管理JVM
Program_newbie
博客等级 码龄18年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值