![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
jvm
小阳同学^_^
是行动让潜能无限
展开
-
17、SPI
spi 1、什么是SPI 是Java核心包的接口(放在<java_home>/jre/lib下,被BootstrapClassLoader 加载),但是实现由第三方服务商实现。 第三方服务商的实现类的类名放在 /meta-inf/services 下。但是编译后的class类放在 web-inf/classes文件下 2、SPI是由上层服务提供的接口,加载下层的实现类。 3、SPI的使...原创 2020-03-29 14:51:50 · 140 阅读 · 0 评论 -
16、基于栈的解释执行过程
public int calc(){ int a=100; int b=200; int c=300; return (a+b)*c; } 编译后的字节码 public int calc(); Code: Stack=2, Locals=4, Args_size=1 0: bipush 100 2: istore_1 ...原创 2020-03-28 18:10:38 · 125 阅读 · 0 评论 -
15、方法的调用
1、运行时虚拟机栈的结构 局部变量表,操作数栈,动态链接,返回地址 2、解析: 解析是在类加载的时候,class文件里存放的方法的符号引用,解析就是将符号引用转化为直接引用的过程。编译时就能确定,并且能将符号引用转化为直接引用的,叫静态解析。运行时才能够加载到方法区的方法,这时候才会有方法入口,在运行时将符号引用转换为直接引用,叫做动态解析 3、动态链接指的就是将符号引用解析为直接引用地址 静态分...原创 2020-03-28 17:57:53 · 94 阅读 · 0 评论 -
14、运行时栈帧结构
jvm运行时线程私有的内存区域 虚拟机栈分为4个部分:局部变量表、操作数栈、动态链接、返回地址和附加信息 局部变量表 局部变量表在编译的时候,已经计算好了分配的内存空间 局部变量表的最小单位 slot java么有说明slot占多少个字节,多少位,但是,是这样说的。1个slot可以存放int、float、short、boolean、 refrence、byte、char、returnAddres...原创 2020-03-26 23:00:06 · 178 阅读 · 0 评论 -
13、类加载器(ClassLoader)
java有三大类加载器: bootstrap 启动类加载器,也叫根加载器 主要加载 <java_home>/jre/lib/ 下的.jar文件或-Xbootclasspath参数指定的路径下的jar包。例如 rt.jar 只加载.jar文件中以 java,javax,sun开头的Class文件 启动类加载器是和JVM绑定的。是用C++实现的。 Extension 扩展类加载器 是在JV...原创 2020-03-25 23:26:43 · 108 阅读 · 0 评论 -
12、类加载过程
加载 1、通过1类的全路径名来获取定义该类的二进制字节流 2、加载常量到方法区中的常量池 3、在方法区生成一个这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 **是不是所有的对象都会加载到堆中?**答案是NO。 虚拟机将类加载到方法区的时候,就会在方法区生成一个Java.lang.Class的对象 加载文件来源:ZIP包、WAR包、JSP动态生成、Proxy、从...原创 2020-03-24 22:42:40 · 78 阅读 · 0 评论 -
11、类的加载顺序
类加载顺序 1、加载父类中的静态代码块 2、加载子类中的静态代码块 3、加载父类中的普通代码块 4、加载父类中的构造方法 5、加载子类中的普通代码块 6、加载子类中的构造方法 静态代码块优先被加载(先加载父类,后加载子类) 父类中普通代码块和构造方法(父类先加载,父类中普通代码块先加载,最后再加载构造方法(任何时候构造方法都是最后加载的)) 子类中普通代码块和构造方法 代码实例 public cl...原创 2020-03-23 22:51:48 · 103 阅读 · 0 评论 -
10、类加载时机
1、类从CLASS文件被加载到JVM中,整个生命周期: 加载、检验、准备、解析、初始化、使用、卸载 连接(linking):检验、准备、解析 其中:固定的顺序有:加载、检验、准备、初始化、卸载。 解析在某些情况下会在初始化之后再进行(这是为了支持Java的动态绑定或晚期绑定) 2、触发类初始化(有且只有这几种情况)(加载、检验、准备在初始化之前执行) 1)new 对象 2)访问静态变量 3)访问静...原创 2020-03-23 22:42:01 · 70 阅读 · 0 评论 -
9、解释执行和编译执行
我们平时写的Java代码,会通过/bin目录下的Javac编译成class字节码,此次编译的时候会有一次重排序。 什么是解释执行(Java的夸平台性由此而来):解释执行就是JVM将Javac编译的class字节码,拿出来一行一行解释成机器码 什么是JIT(即时编译):Javac将Java代码编译成class字节码,JVM再讲字节码编译成与平台和机器相关的机器码。方便执行的更快。 JIT(just ...原创 2020-03-22 22:05:47 · 122 阅读 · 0 评论 -
8、Class类文件的结构
1、魔数:前4个字节(0xCAFEBABE),是来确定是否是class文件的。翻译过来就是咖啡宝贝 2、class版本:第5、6个字节是次版本号,第7、8个字节是主版本号 3、常量池入口:接下来存放的就是常量池。常量池是个表结构的。有21项常量。1.7以前共11张表,JDK1.7以后共14张表 常量池主要放2大类常量。字面量和符号引用 字面量:常量。被final修饰的静态变量 符号引用:1)类和接...原创 2020-03-22 19:51:57 · 110 阅读 · 0 评论 -
7、老年代进入条件
1、躲过15次GC,进入老年代 可以通过JVM参数 “-XX:MaxTenuringThreshold”来设置,默认情况是15岁 2、分配担保; CMS:将Eden+servivor -->移动到另一个servivor中的时候,servivor空间不够用,会在老年代做分区担保 3、大对象: CMS(老年代收集器)配合Serial和ParNew(年轻代):可参数配置。直接进入老年代,跟随老年代...原创 2020-03-21 16:18:26 · 1031 阅读 · 0 评论 -
6、G1
G1内存模型 1、内存布局: 没有了原来的物理隔离,只是把堆分成了2048个Region区(每个区1MB~32MB不等),所以堆空间的上限是64G 新生代的大小范围是 5%~60%。是根据用户配置的可暂停时间来动态分配的。 2、分区:Eden(年轻代),Servivor(幸存者),old(老年代),Humongous(巨行分区,属于老年代) CMS收集器分区:年轻代:eden+servivor+...原创 2020-03-21 16:09:19 · 260 阅读 · 0 评论 -
5、垃圾收集器(JVM)
###serial 单线程收集器,在JDK1.3以前使用。 serial是新生代收集器,可配合CMS(老年代JDK1.5,JDK1.6)使用 ###ParNew 多线程收集器,除了多线程外,和serial是一样的 可配合CMS使用 ###CMS 并发低卡顿收集器 为什么会有CMS收集器呢? 因为之前的老年代收集器(Parallel Old和Serial Old)在GC的时候会全区静止(Full ...原创 2020-03-19 21:36:14 · 85 阅读 · 0 评论 -
4、垃圾收集算法
###标记-清除 该算法最大的缺点是会产生内存碎片,弃用 ###复制算法 JDK1.7的时候,会将堆划分为多个eden-servivor-servivor 该算法用于新生代 Eden:servivor:servivor 8:1:1 新生代的对象70%-95%都是被GC的。所以会将Eden区和servivor区存活的对象,复制到另一个servivor中。如果这个servivor区的内存不够时,会...原创 2020-03-19 11:51:30 · 83 阅读 · 0 评论 -
3、对象已死吗?
###怎么判断哪个对象可以被GC回收 1、计数法:每个对象内部记录了被调用的次数,当新增1个引用时,计数器 +1,当引用失效时候,计数器-1 缺陷:当出现循环引用的时候,GC回收不了 2、可达性分析算法: 从GC ROOTS 链上开始,不在GC ROOTS链上的都需要被GC 在JAVC中可作为GC ROOTS的对象: 1)Java虚拟机栈的局部变量表中的对象 2)引用本地方法栈的对象 3)引用方法...原创 2020-03-19 11:43:52 · 69 阅读 · 0 评论 -
2、Hotspot虚拟机
###对象的创建 ###对象的内存布局 ###对象的访问定位原创 2020-03-17 22:44:46 · 158 阅读 · 0 评论 -
1、JVM模型
###Java运行时数据区模型 程序计数器,Java虚拟机栈,Java堆,本地方法栈,方法区 ###程序计数器 是线程私有的,记录了线程执行的地址,方便多线程的情况下,线程切换回来的时候,继续执行 字节码解释器工作时,就是通过改变程序计数器的值来选取下一次需要执行的指令:循环、跳转、分支、异常处理、线程切换。 如果执行的是Java方法:程序计数器记录的是Java执行的地址 如果执行的是JNI方法...原创 2020-03-17 10:58:39 · 71 阅读 · 0 评论