JVM底层原理
文章平均质量分 94
以我们编译的class文件入手,讲解全套jvm执行流程,难度适中,全部以举例加图解方式讲解 :class文件结构=》类加载=》总体虚拟机布局=》jdk版本变化带来的布局变化=》栈。方法区.堆的详细介绍=》gc垃圾回收算法
lioncatch
这个作者很懒,什么都没留下…
展开
-
jvm全套分析(全过程思路加图解)
运行过程分析1.编写java类,列如: public class test{ static int a; int b; public haha(){ } public static void main(String []args){ } }遍历后成为一个class文件 class文件中有一段区域常量池存放一些静态的类名称方法和属性,方便后续加载,此时这个文件以及c......原创 2020-05-13 07:48:52 · 735 阅读 · 0 评论 -
栈中对象定位的方式(句柄池,直接引用)
在我们A a = new A();的时候,一般有两种方式使栈中的a指向堆中的对象句柄池a变量知保存了指向句柄池的指针,由句柄池中的实例数据和类型数据指针,间接的访问实例和类型数据直接指向a变量直接指向堆中实例数据对象保存方法区类型数据指针,直接的访问实例数据1.句柄池当对象在垃圾回收时,地址会发生变动,而我们只需改变句柄池中的引用不用去栈中修改,但访问对象需要经过两步直接引用当对象在垃圾回收时,地址会发生变动,我们需要改变栈中的引用,但访问对象只需要经过一步...原创 2020-05-13 06:46:38 · 1317 阅读 · 0 评论 -
gc垃圾回收图解
dsf原创 2020-05-12 19:28:37 · 824 阅读 · 0 评论 -
java类对象的内部结构图解(java对象模型精讲)
对象是在堆中创建的对象的内部结构图为原创 2020-05-12 10:05:29 · 1772 阅读 · 1 评论 -
常量池区分和讲解
第一class文件里有一个常量池,叫做类文件常量池(不清楚的看class文件解析,详细讲过了)第二jdk1.8在我们元空间中有个运行时常量池(就存放些你定义的类常量而已,没什么可讲的)第三在我们堆中有个字符串常量池在这里说一下字符串常量池String s = “ok”会先检查你的字符串常量池中有没有此字符串(用equal方法判断),有的话直接将地址赋值给s,没有的话向你的字符串常量池中创建一个对象,在返回地址也就是说String s1 = “ok”String s2 = “ok”是一样的地原创 2020-05-11 17:05:46 · 353 阅读 · 0 评论 -
方法区jdk1.7,1.8版本的构造变化
首先要明白方法区是一个概念(存放方法的信息),jdk1.7即以前的实现是永久代,jdk8以及以后是元空间jdk1.6:jdk7以前的hotspot里面的结构有,堆。栈。永久代,程序计数器此时的方法区,hotspot的实现是永久代,永久代(方法区)存放的内容有类信息。。字段。。方法。。静态变量和全局变量运行时常量池(里面包含字符串常量池)Class引用ClassLoader的引用方法表jdk1.7:然后在1.7版本迎来了一些改动永久代中的静态变量和运行时常量池中的字符串常量原创 2020-05-11 15:43:06 · 1384 阅读 · 0 评论 -
java虚拟机结构图解(堆栈方法区)
到此应该了解了class文件和类加载的过程,也应该听到了一些堆栈方法区等常用名字,下面来跟大家了解下jvm内存布局jvm内存基础(有一点点基础的即可跳过)jvm 最大的分类分为两个,一个为线程共享的。一个是线程私有的线程私有:jvm虚拟机栈,本地方法栈,程序计数器线程共享:堆和方法区线程私有:比如我除了main线程还另外写了一个Test线程,他们同时在执行,那么我们内存里就会出现两个线程栈(即图中右边紫色的部分各来一份,全部整到一起,)图中左边即为两个线程栈,每个线程栈里面的都有若干个栈帧,一个原创 2020-05-11 10:55:24 · 4761 阅读 · 0 评论 -
类加载过程(时机)略解
类加载,名副其实,就是将你class文件的内容,加载进jvm,过程分为三部,加载链接初始化,先了解什么时候发生类加载,1.类加载的时机(什么时候发生类加载)—当你的类被实例化的时候,即创建了这个对象的实例 new Test();—当你访问了或修改了该类里的静态变量的时候Test.a=4;—当你调用此类的静态方法的时候Test.getA();—当你用反射的时候Class.forName()—此类的子类被初始化的时候—JVM启动时标明的启动类,即文件名和类名相同的那个类2.类加载过程1.加载原创 2020-05-10 18:15:54 · 534 阅读 · 0 评论 -
类加载器详解(自己实现类加载器)
目的:看懂4,并且自己实现一个类加载器1.类加载器是什么东西2.类加载器的种类3.类加载器的机制4.自己实现一个类加载器在这里引用大佬的链接,这个是讲的很详细的,如果心急,不想细细研究那就直接看我总结的吧类加载器是什么东西?1.类加载器就是加载所有的类的工具,它加载的类在内存中只会存在一份,也就是生成的堆中的Class对象。不可以重复加载2.在我们java编码里,一个类是用全限定名(包名加类名)标识的唯一的一个类,但在jvm里是根据类加载器+全限定名来标识,也就是说不同类加载器加载的同一个类原创 2020-05-09 13:31:22 · 3168 阅读 · 4 评论 -
jvm压缩指针原理以及32g内存压缩指针失效详解
操作系统在32位到64位的转变中,内存容量可以从4g(2的32次方)到无穷大(2的64次方近似无穷)。在一个32位的系统中,内存地址的宽度就是32位,这就意味着,我们最大能获取的内存空间是2^32(或者4 G)字节。这个容量明显不够用了!在一个64位的机器中,理论上,我们能获取到的内存容量是2^64字节,这是一个十分庞大的数字(ridiculously huge number)。可惜的是,这只是一...原创 2020-05-04 18:27:04 · 5858 阅读 · 8 评论 -
class属性表种类集合,以及字段详解
在Class文件,字段表,方法表都可以有属性表数组,属性表中不要求有严格的顺序,下面是所有虚拟机的属性表的类型在这里笔者只列举出常用的几个,如果想要全部的信息 =》参考文章,自认为写的很详细其实所有的这些类型都有共同的结构,如下图如果开始了一个属性表则前两个字节(attrubite_name_index)一定是引向常量池的第n个常量项,一个utf8类型的字符串,例如:Code,Sour...原创 2020-05-07 11:14:41 · 2096 阅读 · 0 评论 -
class文件-常量池类型汇总
所有的字段类型就是这些了,下面写出每个类型的结构tag值:7CONSTANT_Class_infoCONSTANT_Class_info { u1 tag;//7 u2 name_index;}tag值:9CONSTANT_Fieldref_infoCONSTANT_Fieldref_info { u1 tag; //9 u2 class_...原创 2020-05-06 19:57:21 · 671 阅读 · 0 评论 -
class文件详解(全过程举例加图解)
sdfgnm原创 2020-05-07 11:16:54 · 2943 阅读 · 3 评论