
java虚拟机
文章平均质量分 92
ljz2016
这个作者很懒,什么都没留下…
展开
-
java虚拟机(一)--内存区的划分
java虚拟机所管理的内存主要包含5个运行时区:方法区(Method Area)虚拟机栈(VM Stack)本地方法栈(Native MethodStack)堆(Heap)程序计数器(Program Counter Register)程序计数器是一块比较小的内存区,它记录了当前线程所执行的字节码的行号。字节码解释器运行时根据程序计数器取下一条需要执行的字节码指令,分支、循环、跳转、异常处原创 2017-08-23 16:44:10 · 326 阅读 · 0 评论 -
Java虚拟机(十一)--字节码组成、概述与解析
字节码概述1.class文件构成基础 在class文件中,数据都是以二进制流的形式存储。这些字节流之间按照规定顺序排列,字节之间不存在空隙,对于超过8位的数据,将按照大端的顺序存储(即高位字节存储在低的地址上,低位存储到高地址上)。2.class文件的10个组成结构 class字节码采用类C语言的结构体来存储数据,主要有两类数据项:无符号数和表。无符号数用来表示数字、索引引用以及...原创 2018-10-01 22:31:47 · 629 阅读 · 0 评论 -
Java虚拟机(十二)--字节码解析附录
JVM常量池元素编号常量池元素名称tag位标识含义1CONSTANT_Utf8_info1utf-8编码的字符串2CONSTANT_Integer_info3整型字面量3CONSTANT_Float_info4浮点型字面量4CONSTANT_Long_info5长整型字面量5CONSTANT_Double_info6双...原创 2018-10-03 00:07:39 · 287 阅读 · 0 评论 -
Java虚拟机(十六)--类方法解析
Java方法的解析大体上分为3步:在Java源代码编译期间,编译器负责将Java类源代码翻译为对应的字节码指令,同时完成的工作还有Java方法的局部变量表的计算,以及最大操作数栈的计算。在jvm运行期间,jvm加载类型,调用classFileParser:parseClassFile()函数对Java class字节码文件进行解析,这一步将会完成Java方法的解析、字节码指令存放、父类与接口...原创 2018-10-13 18:14:59 · 571 阅读 · 0 评论 -
Java虚拟机(十三)--常量池解析
解析常量池是解读Java字节码文件的的基础。jvm会将字节码文件中的常量池信息进行解析,并存储到jvm内存模型中的常量区。jvm使用ClassFileParser:parseClassFile()方法解析字节码文件。内部解析步骤:解析魔数解析版本号解析常量池解析父类解析接口解析类变量解析类方法构建类结构常量池内存分配jdk1.6时,perm区内存是在堆内存中的,jd...原创 2018-10-06 18:07:56 · 724 阅读 · 0 评论 -
Java虚拟机(十七)--执行引擎
在jvm内部,最精华部分就是执行引擎和GC。执行引擎有字节码解释器,模板解释器以及JIT即时编译器。物理机器执行指令的流程是:取指(操作码+操作数构成),取指入寄存器译码执行 (取操作数+运算)取下一条指令jvm没有空转机制,所以一旦处理完自身的初始化逻辑,就会进入Java程序,执行字节码指令。...原创 2018-10-14 17:15:29 · 2136 阅读 · 0 评论 -
Java虚拟机(十四)--类变量解析
在ClassFileParser:parseClassFile()函数中,解析完常量池、父类和接口之后,就会调用parse_fields()函数解析类变量信息。在解析前,会定义一个变量fac,这是一个结构体类型,用于存储各种字段的数量。struct FieldAllocationCount{ unsigned int static_oop_count; //引用类型 unsigned in...原创 2018-10-07 23:22:55 · 496 阅读 · 0 评论 -
Java虚拟机(十五)--使用HSDB查看运行期内存分布
HSDB是jvm自带的工具用来查看运行期内存中的分布状态。首先跑起来一个进程,打上端点。示例源码:public class Person { int a=5; public static void main(String[] args) { Person p=new Person(); p.test(); } public v...原创 2018-10-09 09:34:16 · 1438 阅读 · 0 评论 -
Java虚拟机(十八)--锁与并发、内存模型
对象在jvm中分为对象头和数据体。对象头由_mark和_metadata组成,在不开启指针压缩的情况下,各占用一个指针宽度。原创 2018-10-18 16:53:07 · 336 阅读 · 0 评论 -
CopyOnWriteArrayList
它是arraylist线程安全的版本(add,set等操作),使用数组实现。创建时,会产生一个新的数组备份。它在需要保证线程安全的遍历列表的时候,比较高效。、添加的时候,使用reentrantlock锁,每添加一个元素,就会新创建一个数组,把内容复制过去。 public boolean add(E e) { final ReentrantLock lock = this.l...原创 2018-12-19 10:36:06 · 117 阅读 · 0 评论 -
Java虚拟机(十)--面向对象、oop-klass模型
编程的本质就是使用合适的算法处理特定的数据结构。算法是指令驱动的,一条条指令按照一定的顺序执行,彼此写作,最终实现原创 2018-10-01 17:18:56 · 437 阅读 · 0 评论 -
Java虚拟机(九)--方法调用(二)
源码:public class Test { public static void main(String[] args) { add(5,8,null); } public static long add(int a, long b,String[] args) { long c=a+b; long d=c+9; ...原创 2018-09-25 23:37:32 · 169 阅读 · 0 评论 -
Hotspot虚拟机--对象分配,内存布局,访问定位
对象创建流程:内存布局: 对象头还有一部分存的是类型指针。访问定位: Java虚拟机通过栈上的reference来定位堆中的具体对象,而通过引用来访问对象的具体方式常用“句柄”和“直接指针”这两种。 句柄访问:Java堆中会划分出一块内存用来作为句柄池,reference中存储的是句柄地址,句柄中存储了对象实例数据和类型数据各自的具体地址。 直接指针:reference存放的就是堆中对象原创 2017-09-22 16:21:39 · 325 阅读 · 0 评论 -
Java虚拟机(二)--OOM异常
待续原创 2017-09-25 00:39:36 · 282 阅读 · 0 评论 -
java虚拟机(三)---对象存活
为什么要研究垃圾回收器? 需要排查各种内存溢出和泄露问题时,系统垃圾回收成为高并发的瓶颈时,需要对这种自动化的技术进行监控和调节。主流语言都是使用“可达性分析”算法来判断对象是否存活(通过一系列GC Roots 对象作为起始点,从这些节点开始向下搜索,走过的路径称为引用链,一个对象到与GC roots之间没有任何路径时,该对象就是不可达的)。java语言中,可以作为GC Roots的对象有:原创 2017-11-21 15:07:36 · 200 阅读 · 0 评论 -
java虚拟机(四)--垃圾回收算法与垃圾收集器
“标记-清除”算法: 先标记出所有需要回收的对象,标记完成后,统一回收。 缺点:效率低,空间碎片(导致GC次数增多)“复制”算法: 将内存分成2块,一块满了的时候,将存活的对象复制到另外一块上面,然后把这块完整清除。 现在商业虚拟机一般采用这种算法,将内存分为一个新生代和两个幸存代,比例为8:1(默认),触发GC时,将新生代和一个幸存代中的存活对象复制到另一个幸存代中,只有10原创 2017-11-21 16:04:07 · 197 阅读 · 0 评论 -
java虚拟机(五)--jvm启动参数设置
对象内存分配,大方向是分配在新生代的Eden区,如果启动了本地线程分配缓冲,就分配在TLAB上,少数时候直接分配在老年代中,分配规则与虚拟机选择的内存参数和垃圾收集器有关。在jdk 1.8的环境下:虚拟机参数:-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:SurvivorRatio=8 public static int _1mb=1024*原创 2017-12-05 10:24:15 · 1397 阅读 · 0 评论 -
java虚拟机(六)--类的装载
类加载器 类的加载分为3步, 1.加载:查找并加载类的二进制数据,在元数据区中生成class的数据结构(jvm内部的C++对象) 2、验证、解析:验证加载的类的正确性,(文件格式,元数据,字节码,符号引用) 为类的静态变量分配内存,并初始为默认值 解析,把常量池中的符号引用转换为直接引用(也就是把符号引用,转换为目标方法在方法表中的位置) 3、初始化:执行静态变量和静态...原创 2018-08-15 14:15:24 · 397 阅读 · 1 评论 -
java虚拟机(七)--常用指令
一、常量入栈指令 分为const,push,ldc。const系列,常量包含在指令本身里, push指令主要包括 bipush(8位),sipush(16位)。比如 bipush 50 ldc接收 8位参数(指向常量池中int,float,string的索引),ldc_w接收16位参数。ldw2_w接收的参数指向常量池long,double类型索引。 二、局部变量压栈 xload(i...原创 2018-08-20 16:11:03 · 1220 阅读 · 0 评论 -
Java虚拟机(八)--方法调用(一)
方法作为程序的基本单元,作为原子指令的初步封装,计算机必须支持方法的调用。同样,Java语言的原子指令是字节码,Java方法是对字节码的封装,因此jvm必须支持对Java方法的调用。JVM最后实际调用的并不是Java函数,而是对应的机器指令。以汇编演示一个求和程序:先是main函数main: //保存调用者栈基地址,并为main函数分配新栈空间 pushl %ebp movl %es...原创 2018-09-20 08:34:08 · 418 阅读 · 0 评论 -
jvm常用参数设置
-Xms2000M -Xmx2000M -Xmn600M -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:CompressedClassSpaceSize=128m原创 2019-04-17 16:34:56 · 235 阅读 · 0 评论