![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm虚拟机
文章平均质量分 86
逗比123号
这人很懒,什么都没有写
展开
-
HotSpot虚拟机对象
对象的创建Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。 在语言层面上,创建对象(例如克隆、 反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(这里讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检原创 2017-02-09 11:25:41 · 310 阅读 · 0 评论 -
Java内存模型与线程
主内存和工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、 静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。 Java内存模型规定了所有的变量都存转载 2017-02-15 14:34:56 · 176 阅读 · 0 评论 -
运行期优化
即时编译器JIT1.解释器与编译器 尽管并不是所有的Java虚拟机都采用解释器与编译器并存的架构,但许多主流的商用虚拟机,如HotSpot、J9等,都同时包含解释器与编译器。 解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高转载 2017-02-15 11:17:29 · 259 阅读 · 0 评论 -
编译期优化
Javac编译器编译过程大致可以分为3个过程,分别是:1.解析与填充符号表过程。2.插入式注解处理器的注解处理过程。3.分析与字节码生成过程。解析与填充符号表1.词法、 语法分析 词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、 变量名、 字面量、 运算符都可以成为标记,转载 2017-02-14 16:50:05 · 241 阅读 · 0 评论 -
垃圾收集器
Serial收集器 Serial收集器是最基本、 发展历史最悠久的收集器,曾经(在JDK 1.3.1之前)是虚拟机新生代收集的唯一选择。 大家看名字就会知道,这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。“Stop The Wo转载 2017-02-09 21:01:42 · 230 阅读 · 0 评论 -
内存分配和回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。 少数情况下也可能会直接分配在老年代中,分配的规则并不是百转载 2017-02-09 21:22:44 · 601 阅读 · 1 评论 -
类文件结构
Class类文件结构 任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。 Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。转载 2017-02-13 14:20:05 · 168 阅读 · 0 评论 -
类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、 转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、 验证(Verification)、 准备(Preparation)、 解析(Resolution)、 初始化(Initia转载 2017-02-14 10:33:57 · 202 阅读 · 0 评论 -
虚拟机字节码执行引擎
运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。 栈帧存储了方法的局部变量表、 操作数栈、 动态连接和方法返回地址等信息。 每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。 每一个栈帧都包括了局部变量表转载 2017-02-14 15:52:34 · 207 阅读 · 0 评论 -
垃圾收集器回收算法以及算法实现
判断对象是否存活引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。但是,至少主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。 虚拟机并不是通过引用计数算法来判断对象是否存活的。可达性分析算法原创 2017-02-09 15:53:37 · 344 阅读 · 0 评论 -
java运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,原创 2017-02-09 10:08:25 · 205 阅读 · 0 评论 -
线程安全和锁优化
线程安全 我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、 绝对线程安全、 相对线程安全、 线程兼容和线程对立。1.不可变 不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。 Java语言中,如果共享数据是一个基本数据类型,那么只要在定义时使用final关键字修饰它就可以保转载 2017-02-15 15:46:03 · 297 阅读 · 0 评论