了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的.感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助. 上一章节&l…
0.前言 了解JVM虚拟机原理是每个Java程序猿修炼的必经之路.可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写叙述.非常难给人以形象化的认知.看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西.结合自己的理解.总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识详细化,希望可以对想了解Java虚拟机原理的的Java程序猿 提供点帮助…
[last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件里的魔数.副版本号号.主版本号之后,紧接着就是常量池的数据区域了,例如以下图用红线包含的位置: 知道了常量池的位置后,然后让我们来揭秘常量池里到底有什么东西吧- NO2.常量池的里面是怎么组织的? 常量池的组织非常easy,前端的两个字节占有的位置叫做常量池计数器(constan…
0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助. 读…
NO9.类中引用到的field字段在常量池中是如何描写叙述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言.我们在定义类的过程中会定义一些 field 字段.然后会在这个类的其它地方(如方法中)使用到它.有可能我们在类的方法中仅仅使用field字段一次.也有可能我们会在类定义的方法中使用它非常多非常多次. 举一个简单的样例.我们定一个叫Person的简单java bean,它有name和age两个field字段,例如以下所看到的:…
作为Java程序猿,我们知道,我们写好的.java 源代码,最后会被Java编译器编译成后缀为.class的文件,该类型的文件是由字节组成的文件,又叫字节码文件.那么,class字节码文件里面到底是有什么呢?它又是怎样组织的呢?让我们先来大概了解一下他的组成结构吧. NO1. 魔数(magic) 所有的由Java编译器编译而成的class文件的前8个字节都是“0xCAFEBABE”        它的作用在于:当JVM在尝试加载某个文件到内存中来的时候,会首先判断此class文件有没有JVM认为…
[最新更新:2014/11/11]  了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写叙述,非常难给人以形象化的认知.看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识详细化,希望可以对想了解Java虚拟机原…
0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助.…
我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧- NO2.常量池的里面是怎么组织的? 常量池的组织很简单,前端的两个字节占有的位置叫做常量池计数器(constant_pool_count),它记录着常量池的组成元素  常量池项(cp_info) 的个数.紧接着会排列着co…
了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的.感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助. 上一章节&l…
NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧- NO2.常量池的里面是怎么组织的? 常量池的组织很简单,前端的两个字节占有的位置叫做常量池计数器(constant_pool_count),它记录着常量池的组成元素  常量池项(…
讲完了class文件里的常量池,我们就相当于克服了class文件里最麻烦的模块了.如今,我们来看一下class文件里紧接着常量池后面的几个东西:訪问标志.类索引.父类索引.接口索引集合. 1. 訪问标志.类索引.父类索引.接口索引集合 在class文件里的位置 好,让我们来一一击破它们,看看它们究竟是什么东西. 2. 訪问标志(access_flags)可以表示什么? 訪问标志(access_flags)紧接着常量池后.占有两个字节.总共16位,例如以下图所看到的: 当JVM在编译某个类或者接口…
[last updated :2014/11/7]     JVM执行时数据区(JVM Runtime Area)事实上就是指JVM在执行期间,其对计算机内存空间的划分和分配.本文将通过下面几个话题来讨论JVM执行时数据区. Topic 1. JVM执行时数据区里有什么? Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么? Topic 3.栈帧是什么?栈帧里有什么? Topic 4. 方法区是什么?方法区里有什么? Topic 1.JVM执行时数据区里有什么? Topic 2. 虚拟机栈是什…
讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标志.类索引.父类索引.接口索引集合 在class文件中的位置 好,让我们来一一击破它们,看看它们到底是什么东西. 2. 访问标志(access_flags)能够表示什么? 访问标志(access_flags)紧接着常量池后,占有两个字节,总共16位,如下图所示: 当JVM在编译某个类或者接口的源代码…
0. 前言 Java虚拟机和真实的计算机一样,执行的都是二进制的机器码:而我们将.java 源码编译成.class 文件,class文件便是Java虚拟机可以认识的二进制机器码,Java可以识别class文件里的信息和机器指令,进而执行这些机器指令. 那么,Java虚拟机是怎样执行这些二进制的机器码的呢? 本文将通过一个很easy的样例,带你感受一下Java虚拟机执行机器码的过程和其工作的基本原理. 读完本文,你将会了解到: 1.Java虚拟机对执行时虚拟机栈(JVM Stack) 的组织 2.…
作为Java程序猿,我们知道,我们写好的.java 源代码,最后会被Java编译器编译成后缀为.class的文件,该类型的文件是由字节组成的文件,又叫字节码文件.那么,class字节码文件里面到底是有什么呢?它又是怎样组织的呢?让我们先来大概了解一下他的组成结构吧. NO1. 魔数(magic) 所有的由Java编译器编译而成的class文件的前4个字节都是“0xCAFEBABE”         它的作用在于:当JVM在尝试加载某个文件到内存中来的时候,会首先判断此class文件有没有JVM认…
CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言,我们在定义类的过程中会定义一些 field 字段,然后会在这个类的其他地方(如方法中)使用到它.有可能我们在类的方法中只使用field字段一次,也有可能我们会在类定义的方法中使用它很多很多次. 举一个简单的例子,我们定一个叫Person的简单java bean,它有name和age两个field字段,如下所示: package com.louis.jvm; public class Per…
具体详情参考: http://blog.csdn.net/luanlouis/article/details/41046443 http://blog.csdn.net/luanlouis/article/details/41039269 http://blog.csdn.net/luanlouis/article/details/40301985 http://blog.csdn.net/luanlouis/article/details/41113695  好好学习,天天向上.…
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用过的Dalvik虚拟机. 也许有人会问,既然Dalvik虚拟机都已经被废弃了,为什么我们还要了解它呢?出于下面的原因,让我觉得还是有必要了解一下Dalvik虚拟机的: Dalvik留下的很多机制在现在的Android系统是一样适用的,例如Dalvik指令,dex文件 并非每个人都是在最新版本的And…
什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码,ByteCode), 就可以在多种平台上不加修改地运行.这背后其实就是JVM把字节码翻译成具体平台上的机器指令,从而实现"一次编写,到处运行(Write Once, Run Anywhere)". Java为什么能够跨平台? Java引入了字节码的概念,jvm 只能认识字节…
1.编译机制 分析和输入到符号表: 词法分析:将代码转化为token序列 语法分析:由token序列生成抽象语法树 输入到符号表:将类中出现的符号输入到类的符号表 注解处理: 处理用户自定义注解,之后继续第一步 根据符号表进行语义分析并生成class文件,并进行相关优化 虚拟机数据类型.字节码文件格式.虚拟机指令集   2.执行机制 2.1.加载.链接.初始化 2.1.1.加载 双亲委派.线程上下文类加载器.Web容器.OSGi: http://www.ibm.com/developerwork…
所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmare就属于系统虚拟机,他们完全是对物理计算的仿真, 提供了一个可以运行完整操作系统的软件平台. 程序虚拟机典型代码就是Java虚拟机,它专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们成为Java 自己码指令.无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中. Java发展至今,出现过很多虚拟机,…
Java堆 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号. 根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为 新生代和老年…
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 对于程序计数器.虚拟机栈.本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭.并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了.因此本篇文章所讲的有关内存分配和回收关注的是Java堆与方法区这两个区域. 1.如何判断对象已“死” Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断…
Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java Virtual Machine Stack)是线程私有的,它的生命周期与线程相同.虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表.操作数栈.动态连接.方法出口等信息.每一个方法被调用直至执行完毕的过…
https://blog.csdn.net/sun1021873926/article/details/78002118 115道Java经典面试题(面中率最高.最全) 史上最全 40 道 Dubbo 面试题及答案 给初中级JAVA准备的面试题 为什么说Redis是单线程的? Redis为什么是单线程 mysql数据库引擎常用面试总结 2018java基础面试题 SpringBoot运行原理 java异常面试常见题目 jedis常用方法封装 java中使用Jedis操作Redis实例 一个JAV…
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 1.对象优先在Eden分配 大多情况,对象在新生代Eden区分配.当Eden区没有足够空间进行分配时,虚拟机将进行一次Minor GC.虚拟机提供了参数 -XX:+PrintGCDetails ,在虚拟机发生垃圾收集行为时打印内存回收日志. 新生代Minor GC 事例 定义了4个字节数组对象,3个2MB大小.1个4MB大小, 通过-Xms20M -Xmx20M -Xmn10M…
我们先创建两个文本文件,out.txt和in.txt,在out.txt中输入"Hello World",然后使用FileInputStream把字符串读取出来,再使用FileOutputStream字符串输入到in.txt文件中,示例代码如下 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public cl…
包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Character float-->Float double-->Double boolean-->Boolean 基本类型转为包装类型: 自动装箱Autoboxing:将基本类型直接赋值给包装类变量或者Object类变量 包装类型转为包装类型: 自动拆箱AutoUnboxing:把包装类对象直接赋值给基本…
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja…