JVM
ice__cookie
这个作者很懒,什么都没留下…
展开
-
深入理解java虚拟机——虚拟机类加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。在 Java 语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。1. 类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。验证、准备、原创 2018-01-16 19:51:36 · 187 阅读 · 0 评论 -
深入理解java虚拟机——内存模型与线程
1. Java 内存模型Java 虚拟机规范中试图定义一种 Java 内存模型来屏蔽各种硬件和操作系统的内存访问差异。Java内存模型的主要目标是定义程序中各个变量的访问规则。Java 内存模型规定了所有的变量都存储在主内存中。每条线程有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程不能读写主内存中的变量,不同的线程之间也无法直接访问对方工作内存中的变量,线程原创 2018-01-18 20:54:24 · 168 阅读 · 0 评论 -
深入理解java虚拟机——语法糖
语法糖可以看做是编译器实现的一些“小把戏”,这些“小把戏”可能会使得效率“大提升”。1. 泛型与类型擦除本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法。泛型其实是 javac 提供给我们的一颗语法糖,因为它在编译阶段采用类型擦除,将泛型还原为原生类型(裸类型),并且在相应的地方插入了强制转原创 2018-01-17 20:35:03 · 189 阅读 · 0 评论 -
深入理解java虚拟机——虚拟机字节码执行引擎
执行引擎是 Java 虚拟机最核心的组成部分之一。所有的 Java 虚拟机的执行引擎都是一致的:输入字节码文件,执行字节码解析的等效过程,输出结果。1. 运行时栈帧结构栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。编译程序代码时,栈帧需要分配的内存已经确定,不会受到程原创 2018-01-17 19:32:02 · 206 阅读 · 0 评论 -
深入理解java虚拟机——类加载器
把类加载器阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为 “类加载器”。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。 比较两个类是否“相等”,只有在这两个类是由同一个类加原创 2018-01-17 11:23:30 · 163 阅读 · 0 评论 -
深入理解java虚拟机——运行时数据区
Java虚拟机管理的内存包括几个运行时数据内存:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。其中方法区和堆是由所有线程共享的数据区,其它几个都是线程隔离的数据区。1. 程序计数器解释:可以看作当前线程所执行的字节码的行号指示器。字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令(分支、循环、跳转、异常处理、线程恢复等基本基本功能)。线程私有:为实现多线原创 2018-01-13 12:23:09 · 242 阅读 · 0 评论 -
深入理解java虚拟机——HotSpot虚拟机对象
1. 对象的创建1.1 类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有,就先执行相应的类加载过程。1.2 分配内存从Java堆中划分出一块确定大小的内存分配给新生对象。垃圾收集器是否带有压缩整理功能决定Java堆是否规整。而Java堆是否规整决定了原创 2018-01-13 15:25:11 · 172 阅读 · 0 评论 -
深入理解java虚拟机——OutOfMemoryError异常
1. Java堆溢出解决方案:通过内存映像分析工具(如 Eclipse Memory Analyzer)对堆转储快照进行分析,确定时内存泄漏还是内存溢出。如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们。掌握了泄露对象的类型信息及GC Roots引用链信息,就可以比较准确地定原创 2018-01-13 16:10:50 · 260 阅读 · 0 评论 -
深入理解java虚拟机——垃圾收集器与内存分配策略
程序计数器、虚拟栈、本地方法栈 3个部分随线程而生,随线程而灭。所以这3个区域就不需要过多的考虑垃圾回收的问题。当方法结束或线程结束时,内存自然就回收了。1.判断对象存活1.1 引用计数器法给对象添加一个引用计数器,每当有一个地方引用它,计数器值加1;当引用失效,计数器值减1;任何时刻计数器为0的对象就是不可能再被使用的。缺点:当对象之间相互循环引用时。假设对象objA和o原创 2018-01-14 17:16:21 · 178 阅读 · 0 评论 -
深入理解java虚拟机——线程安全与锁优化
1. 线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。线程安全的“安全程度”由强到弱来排序,我们可以将 Java 语言中各种操作共享的数据分为以下 5 类:1.不可变:不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的原创 2018-01-19 12:59:46 · 526 阅读 · 0 评论