java虚拟机
文章平均质量分 94
yulio1234
这个作者很懒,什么都没留下…
展开
-
jvm探秘四:class类文件结构
概述一:class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙。当遇到需要占用超过8位字节以上空间的数据项目时,会按照高位在前的方式分割为多个8位字节进行存储。 class原创 2017-11-28 20:55:17 · 336 阅读 · 0 评论 -
jvm探秘十一:虚拟机执行子系统之方法调用
概述方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,方法调用是最普遍和频繁的操作。Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用)。Java方法调用需要在类加载期间,甚至是运行期间才能原创 2017-12-17 20:48:45 · 366 阅读 · 0 评论 -
jvm探秘九:类加载机制之类加载器
概述虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。一:类与类加载器类加载器的作用:首先类加载器可以实现最本质的功能即类的加载动作。同时,它还能够结合java类本身来确定该类在Java虚拟机中的唯一性。用通俗的话来说就是:比较两个类是否相等,只有这原创 2017-12-06 21:20:25 · 300 阅读 · 0 评论 -
jvm探秘八:类加载机制之类加载过程
概述java中类加载的全过程,就是加载,验证,准备,解析和初始化5个阶段执行的具体动作。一:加载“加载”是“类加载”中的一个阶段(两个名词不要弄混了),这个阶段通常也被称作“装载”。 在加载阶段,虚拟机需要完成以下三件事(虚拟机规范对这三件事的要求并不具体,因此虚拟机实现与具体应用的灵活度相当大): 通过“类全名”来获取定义此类的二进制字节流虚拟机规范对于“通过“类全名”来获取定义此类的二进制原创 2017-12-06 20:16:00 · 241 阅读 · 0 评论 -
jvm探秘七:类加载机制之类加载时机
概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载时机从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Us原创 2017-12-04 19:49:51 · 258 阅读 · 0 评论 -
jvm探秘六:字节码指令集
概述java虚拟机的指令有一个字节长度的,代表某种特定的操作含义的数字(操作码)以及跟随其后的零至多个代表此操作所需参数(操作数)构成。 由于java虚拟机采用面向操作数栈而不是寄存器的架构,大多数指令都不含操作数,只有一个操作码。Java虚拟机的操作码长度为一个字节,即0~255。do { 自动计算 PC 寄存器的值+1; 从 PC 寄存器指定的位置,从字节码流中取出操作码; i原创 2017-12-03 21:11:19 · 296 阅读 · 0 评论 -
jvm探秘二:对象的创建
概述创建对象在java源码中只是一个new的关键字而已,而在虚拟机中对象是怎么创建的呢,以下只讨论java对象,不包括数组和Class对象。一:对象的创建当虚拟机遇到一个new指令时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类的加载过程。1为对象分配内存 对象所需内存的大小在类加载完成后便完全原创 2017-12-03 20:22:22 · 230 阅读 · 0 评论 -
jvm探秘三:垃圾回收
概述c和c++语言中,每次内存的使用需要申请和归还,而java中并不需要这么做,归根结底是因为jvm有一套完整的内存管理策略,内存的申请和释放都有jvm完成了,编程人员再也不需要关注于内存的使用,只需要专注于业务逻辑的实现就行了。一:对象存活的判断引用计数算法:给对象中添加一个引用计数器,每有一个地方引用时计数器就加1,引用失效时就减1,计数器为0时就是不可能在被使用的。但对象相互嵌套引用时会造成会原创 2017-11-20 20:35:02 · 288 阅读 · 0 评论 -
jvm探秘五:Class类文件结构之属性表
概述在Class文件、字段表和方法表都可以携带自己的属性信息,这个信息用属性表进行描述,用于描述某些场景专有的信息。与Class文件中其它数据项对长度、顺序、格式的严格要求不同,属性表集合不要求其中包含的属性表具有严格的顺序,并且只要属性的名称不与已有的属性名称重复,任何人实现的编译器可以向属性表中写入自己定义的属性信息。虚拟机在运行时会忽略不能识别的属性,为了能正确解析Class文件,虚拟机规范中原创 2017-12-03 11:17:46 · 1939 阅读 · 0 评论 -
jvm探秘十:虚拟机字节码执行引擎之栈帧
概述执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器,硬件,指令级和操作系统层面上的,而虚拟机的执行引擎是由自己实现的,因此可以自行制定指令集与指令集的体系结构,并且能够执行那些不被硬件直接支持的指令格式。Java虚拟机执行引擎在执行Java代码的时候会有解释执行(通过解释器执行)和编译执行(通过原创 2017-12-10 21:20:17 · 384 阅读 · 0 评论 -
jvm探秘一:java内存模型
一:Java内存规范java虚拟机在执行java程序的时候会把管理的内存划分为多个内存区域,每个区域都有各自的用途,根据java虚拟机规范。Java虚拟机会把内存划分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 程序计数器(Program Counter Register) 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执原创 2017-11-18 11:15:55 · 346 阅读 · 0 评论 -
记一次JVM内存溢出造成的tomcat假死排查
今天中午公司老官网挂了,无法访问。领导让我帮同事排查。 首先NGINX没有问题,其他网站都能访问。 然后telnet访问tomcat端口。发现端口已经无法访问。但应用仍在服务器上运行。初步判断是tomcat假死造成的。而能造成tomcat假死的多半就是jvm出问题了。 马上在tomcat启动文件中加入jvm的rmi监控命令和gc日志打印命令。应用重启之后,立马发现了端倪。cpu和内存消耗居高原创 2018-02-02 19:38:37 · 13136 阅读 · 3 评论