
Java虚拟机
文章平均质量分 65
javazcw
这个作者很懒,什么都没留下…
展开
-
深入理解Java虚拟机-对象创建
1.对象创建 (1)给对象分配内存 指针碰撞,适用于内存规整的情况 空闲列表,用一个表记录内存的使用情况 (2)线程安全性问题,在高并发情况下,多个线程为对象申请内存可能会出现冲突,即分配了同一块地址,解决方案 线程...原创 2018-03-29 23:53:30 · 152 阅读 · 0 评论 -
Java虚拟机-指令重排序
1.什么是指令重排序 编译器和处理器为了代码的执行效率会对指令进行重新排序,我们称之为重排序。public class Demo { private int a; private int b; private int c; public void a() { a = 1; //1 b = 2; //2 c ...原创 2018-08-06 19:14:55 · 665 阅读 · 1 评论 -
Java虚拟机-happens-before规则
1.happens-before规则 Happen-before是用来指定两个操作之间的执行顺序,提供跨线程的内存可见性。在Java内存模型中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必然存在happen-before关系。Happen-before规则如下:程序顺序规则、监视锁规则、volatile变量规则、传递性、Start规则、Join规则。2.程序...原创 2018-08-06 19:06:33 · 209 阅读 · 0 评论 -
Java虚拟机-方法调用
1.什么是方法调用方法调用并不等同于方法的执行,方法调用阶段的唯一任务就是确定被调用方法的版本。2.解析调用 在编译期间就能够确定调用方法的版本称为解析调用。什么样的方法能够在编译期间就确定版本呢?静态方法 ,构造方法, final修饰的方法都能够在编译期间就确定其版本。举个例子:public class AnalyseInvokeDemo { public...原创 2018-07-30 19:16:13 · 398 阅读 · 0 评论 -
Java虚拟机-虚拟机字节码执行引擎
1.运行时栈帧结构 栈帧也叫过程活动记录,是编译器用来进行方法调用和方法执行的一种数据结构,它是虚拟机运行时数据区域中的虚拟机栈的栈元素。栈帧中包括局部变量表,操作数栈,动态链接和方法返回地址以及额外的一些附加信息,在编译过程中,局部变量表的大小已经确定,操作数栈深度也已经确定,因此栈帧在运行的过程中需要分配多大的内存是固定的,不受运行时影响。对于没有逃逸的对象也会在栈上分配内存,对...原创 2018-07-24 20:50:44 · 846 阅读 · 2 评论 -
Java虚拟机-字节码指令
1.字节码指令 Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的数字,称之为操作码,以及跟随其后的零至多个代表此操作所需参数的操作数而构成。操作码的长度为1个字节,因此最大只有256条。基于栈的指令集架构。2.字节码与数据类型 在虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。iload fload大多数指令是包含类型信息的。也有不包含类型信息的,Goto,Arra...原创 2018-07-04 20:15:02 · 314 阅读 · 0 评论 -
Java虚拟机-类加载
1.类加载概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。2.类加载时机 加载:Java虚拟机规范并没有严格规定,主流虚拟机是懒加载。 连接:加载开始之后,加载完后,连接结束。 初始化:遇到new、getStatic、putstatic或invokestatic这4条字节码指令时,如果类没有...原创 2018-07-11 10:06:18 · 133 阅读 · 0 评论 -
Java虚拟机-类加载器
1.类加载器虚拟机的设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称之为类加载器。 只有被同一个类加载器加载的类才可能会相等。相同的字节码被不同的类加载器加载的类不相等。2.类加载器分类 启动类加载器 由C++实现,是虚拟机的一部...原创 2018-07-17 16:16:28 · 123 阅读 · 0 评论 -
Java虚拟机-class文件
1.class文件概述Class文件是一组以8位字节为基础单位的二进制流,各个数据项目按照顺序紧凑的摆列在Class文件之中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在当遇到8位字节以上的空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。Class文件中有两类数据类型,分别是无符号数和表,具体包括:魔数,Class文件版本,常...原创 2018-06-26 08:54:38 · 354 阅读 · 0 评论 -
Java虚拟机-调优案例
如何进行虚拟机性能调优?知识,工具,数据,经验。首先要有基础的Java虚拟机知识,借助专业的监控工具,和监控的数据,再融合自己已有的经验做出问题定位,并解决问题。1.案例一场景:一个考核系统,员工可以浏览自己的所有考核项,有图表展示。环境:内存64G。问题:经常有用户反映长时间出现卡顿的现象。处理思路:通过内存监控工具发现经常会发生FullGC,由于系统中经常创建大对象,所以直接会在老年代分配内存...原创 2018-06-01 14:15:46 · 562 阅读 · 0 评论 -
Java虚拟机-虚拟机工具
1.jps java process status显示本地虚拟机唯一id lvmid(local virtual machine id本地和进程id一致) 参数:-l 打印运行的主类 -m 打印主类运行参数 -v 打印主类vm参数...原创 2018-05-30 20:49:54 · 319 阅读 · 0 评论 -
深入理解Java虚拟机-Java内存区域
1.Java内存模型Java虚拟机的逻辑模型如下图:从图中我们可以知道,Java内存模型可以分为5块,其中线程共享的有两个区域,分别是堆和方法区,线程独占的有三个区域,分别是虚拟机栈,本地方法栈和程序计数器。(1)程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器;程序计数器处于线程独占区;如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码...原创 2018-03-29 08:37:38 · 168 阅读 · 0 评论 -
Java虚拟机-内存分配
1.优先分配到Eden区Java虚拟机会优先把新new出来的对象放在新生代这块内存中,口说无凭,下面我们来验证一下。指定虚拟机参数-verbose:gc -XX:+PrintGCDetails把详细的垃圾回收信息打印出来。public class Main { public static void main(String[] args) { }}运行这个类,输出如下:从输出我们可以看到...原创 2018-05-20 17:53:54 · 189 阅读 · 0 评论 -
深入理解Java虚拟机-垃圾收集
1.如何判定对象为垃圾对象 (1)引用计数法 在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值加一,当引用失效的时候,计数器的值减一,不过存在循环引用问题 (2)可达性分析法 定义GC root,一直从GC root向下寻找,如果不可达则是垃圾对象。虚拟机栈,方法区类属性所引用的对象,方法区中常量所引用的对象,本地方法栈中引用的对象可以作为GC Roots的对象。...原创 2018-03-31 15:06:10 · 127 阅读 · 0 评论 -
Java虚拟机-常见的内存语义的分析
1.锁的释放与获取所建立的happens-before关系:public class Demo { private int value; public synchronized void a() { value++; //1 } public synchronized void b() { int a = value; /...原创 2018-08-06 19:44:34 · 210 阅读 · 0 评论