
java虚拟机
文章平均质量分 85
iteye_8208
这个作者很懒,什么都没留下…
展开
-
深入虚拟机笔记之class文件
第6章 java class文件 java class文件是对java程序二进制文件格式的精确定义。每一个class文件都对一个java类或接口做出了全面的描述。一个class文件中只能包含一个类或者接口。 java class文件是8位字节的二进制流。数据项按顺序存储在class文件中,相邻的项之间没有任何间隔,占据多个字节空间的项按高位在前的顺序分为几个连续的字节...原创 2016-04-22 13:13:24 · 104 阅读 · 0 评论 -
Java常量池理解与总结
一.相关概念什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。Class文件中的常量池在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,...原创 2016-10-04 01:14:16 · 95 阅读 · 0 评论 -
JVM运行时的数据区
理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,那么前面的问题就会迎刃而解。在这片文章中,我们将简单了解JVM中有哪些运行时数据区以及这些数据区的工作机制。JVM运行时数据区分类程序计数器 (Program Counter (PC...原创 2016-10-06 13:09:56 · 107 阅读 · 0 评论 -
JVM 基础知识
一、基础概念数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte、short、int、long、char、float、double、Boolean、returnAdd...原创 2016-10-10 14:22:41 · 105 阅读 · 0 评论 -
JVM运行时的数据区 (内存溢出实例)
一、概述运行时数据区是jvm运行时的内存布局,类装载到内存后存放的位置,为执行引擎提供所需指令和数据。运行时数据区包括:堆、栈、方法区、本地方法栈、pc计数器。接下来会详细介绍各个部分,并介绍直接内存访问和方法区中的常量池,另外对于每个区域可能发生的内存异常用demo做讲解。二、详细介绍各部分1、堆分配运行时产生的对象分配在堆中,但是并不是一定就分配在堆中,随着运行时编译器...原创 2016-11-12 15:36:38 · 127 阅读 · 0 评论 -
cpu字长、操作系统字长和jvm中各数据类型占用的字节数关系
cpu字长是指cpu同时参与运算的二进制位数,现在主流的pc的机器字长都是64位的。机器字长直接决定着机器可寻址的虚拟空间地址大小。 Java代码 The word size of a computer generally indicates the largest integer it can process in a single instruc...原创 2016-11-12 15:38:21 · 601 阅读 · 0 评论 -
一个Java对象到底占多大内存?
最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存?在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用:import java.lang.instrument.Instrumentation;...原创 2016-11-13 15:25:50 · 107 阅读 · 0 评论 -
查看java对象在内存中的布局
接着上篇《一个对象占用多少字节?》中遇到的问题: UseCompressOops开启和关闭,对对象头大小是有影响的,开启压缩,对象头是4+8=12byte;关闭压缩,对象头是8+8=16bytes。这个如何观察验证呢? 基于上述事实,通过new A()和new B()占用字节推断,基本类型int在开启、关闭压缩情况下都是占用4个bytes的,这个没有影响。...原创 2016-11-13 15:26:46 · 108 阅读 · 0 评论 -
一个对象占用多少字节?
老早之前写过一篇博客,是关于一个Integer对象到底占用多少字节的,现在看来,那篇文章竟然计算错了。这次再去计算,是因为之前写的一篇关于字长的文章里,看到了hotspot jvm里,对象占用空间是8字节对齐的,再加上之前关于字节那文章里带着一点-XX:+UseCompressedOops压缩指针参数的疑问,重新探究了下一个对象到底占用多少字节,以及如何计算它占用空间的方法。主要...原创 2016-11-13 15:30:33 · 119 阅读 · 0 评论 -
聊聊JVM(五)从JVM角度理解线程
这篇说说如何从JVM的角度来理解线程,可以对Java的线程模型有一个更加深入的理解,对GC的一些细节也会理解地更加深刻。本文基于HotSpot的OpenJDK7实现。 我们知道JVM主要是用C++实现的,JVM定义的Thread的类继承结构如下:Class hierarchy - Thread - NamedThread - VMThread - Concurr...原创 2016-11-17 07:56:14 · 131 阅读 · 0 评论 -
深入虚拟机笔记之线程同步
第20章 线程同步 监视器: java所使用的同步机制是监视器,java中的监视器支持两种线程:互斥和协作。java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独立而互不干扰地工作。协作则是通过Object类的wait、notify和notifyAll方法来实现,允许多个线程为了同一个目标而共同工作。 除了与数据关联之外,监视器还会关联到一些或...原创 2016-04-25 01:21:58 · 97 阅读 · 0 评论 -
深入虚拟机笔记之方法调用和返回
第19章 方法调用和返回 当java虚拟机调用一个类方法时,它会基于对象引用的类型(编译时可知)来选择所调用的方法;相反,当虚拟机调用一个实例方法时,它会基于对象实际的类(只能在运行时得知)来选择所调用的方法。 最初,所有的调用指令都指向一个包含符号引用的常量池入口。当java虚拟机遇到一条调用指令时,如果还没有解析符号引用,那么虚拟机把符号引用作为执行指令调用执行过...原创 2016-04-25 01:21:51 · 199 阅读 · 0 评论 -
深入虚拟机笔记之控制流
第16章 控制流 条件分支:在java源码中,可以在一个方法中使用if、if-else、while、do-while、for和switch语句来指定基本的控制流。当把源码转换成字节码时,除了switch语句外,java编译器使用同样的操作码集。每一种操作码都会从栈顶弹出一个或者两个值,然后进行比较;从栈中弹出一个值的操作码把该值与0进行比较;从栈中弹出两个值得操作码对这两个值进...原创 2016-04-24 00:04:57 · 158 阅读 · 0 评论 -
深入虚拟机笔记之连接模型
第8章 连接模型 动态连接和解析: java class文件把它所有的引用符号保存在常量池中。每一个class文件有一个常量池,每一个被java虚拟机装载的类或者接口都有一份内部版本的独立常量池,被称为运行时常量池。运行时常量池是一个特定于虚拟机实现的数据结构,数据结构映射到class文件中的常量池。因此,当一个类被首次装载时,所有来自于类型的符号引用都装载到了类型的...原创 2016-04-22 13:13:37 · 92 阅读 · 0 评论 -
深入虚拟机笔记之java虚拟机
第5章 java虚拟机 java虚拟机实例通过调用某个初始类的main()方法来运行一个java程序。这个main()方法签名必须是public static void main(String[] args)。 基本类型:持有原始数据。 引用类型:持有引用值,引用值指的是对某个对象的引用,而不是该对象本身。 java中的所有基本类型同样也是j...原创 2016-04-22 13:14:51 · 110 阅读 · 0 评论 -
深入虚拟机笔记之类型的生命周期
第7章 类型的生命周期 java虚拟机通过装载、连接和初始化一个java类型,使该类型可以被正在运行的java程序所使用。 装载:是把二进制形式的java类型读入java虚拟机中。 连接:是把读入的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接分三个子步骤(验证、准 备和解析)。验证步骤确保java类型数...原创 2016-04-22 13:15:08 · 95 阅读 · 0 评论 -
深入虚拟机笔记之垃圾收集
第9章 垃圾收集 在java虚拟机的堆里存放着正在运行的java程序所创建的所有对象。使用new、newarray、anewarray和multianewarray指令来创建对象,但没有明确的指令来释放它们。垃圾收集就是自动释放不再被程序所使用的对象的过程。 当一个对象不再被程序所引用时,它所使用的堆空间可以被回收,以便被手续的新对象使用。垃圾收集器必须能断定哪些对象...原创 2016-04-22 13:15:21 · 125 阅读 · 0 评论 -
深入虚拟机笔记之整数运算
第12章 整数运算 二进制补码运算:java虚拟机支持的所有整数类型:byte、short、int、long,它们都是带符号的二进制补码数。在一个二进制补码数中,最重要的位是它的符号位(最高位),0表示正整数和0,1表示负整数。 能够被二进制补码表示的数值范围为:2的总位数的次幂。其中一半是0和正整数,一半是负整数。 在带符号二进制补码数上进行的加法运算与在...原创 2016-04-23 18:58:39 · 159 阅读 · 0 评论 -
深入虚拟机笔记之栈和局部变量操作
第10章 栈和局部变量操作 由于java虚拟机是基于栈的机器,几乎所有java虚拟机的指令都与操作数栈有关;绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。 常量入栈操作:操作码在执行常量入栈操作之前,使用三种方式指明常量的值:常量值隐式包含在操作码内部、常量值在字节码流中如同操作数一样紧随在操作码之后、或者从常量池中取出常量。 一些操作码自行...原创 2016-04-23 19:00:06 · 155 阅读 · 0 评论 -
深入虚拟机笔记之类型转换
第11章 类型转换 java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶端获得。java虚拟机从栈顶端弹出一个值,对它进行转换, 然后再把转换结果压入栈。 int、float、long和double相互转换操作码: int类型转换为比int类型占据更小空间的数据类型:byte、char、short。 ...原创 2016-04-23 19:00:11 · 106 阅读 · 0 评论 -
深入虚拟机笔记之对象和数组
第15章 对象和数组 在java虚拟机中,内存只能以对象形式在垃圾收集堆中分配。除非作为对象的一部分,否则不能为基本类型分配内存。如果需要在必须使用对象引用的场合使用基本类型,可以从java.lang包中的为基本类型分配一个包装器对象。只有对象引用和基本类型可以在java栈中以局部变量形式存在,java栈不能容纳对象。 java虚拟机中的对象和基本类型的结构分离在ja...原创 2016-04-24 00:03:19 · 385 阅读 · 0 评论 -
深入虚拟机笔记之finally子句
第18章 finally子句 微型子例程:字节码中的finally子句在方法内部的表现很想“微型子例程”。java虚拟机在每个try语句块和与其相关的catch子句的结尾都会调用finally子句的子例程,finally子句结束后(这里结束指的是finally子句中的最后一条语句正常执行完毕,没有抛出异常,或执行return、continue、break等情况),隶属于这个fi...原创 2016-04-24 00:03:30 · 141 阅读 · 0 评论 -
深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变...原创 2016-11-26 20:44:50 · 89 阅读 · 0 评论