
JVM
一起研究java虚拟机啊,基于jdk1.7
骚小孩呀
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
对象到底什么样呢?
本文讨论java对象! JAVA对象中都有什么呢? JAVA对象分为如下3个部分: 对象头: 对象头中主要存储2类信息 对象运行时数据:比如哈希码,GC分代标记,锁标记,偏向线程ID等。 类型指针:指向它类元数据的指针,用来区分对象类型。 实例数据: 对象存储的真正有效数据,存储着自身定义和从父类继承下来的字段。数据存储受到虚拟机分配策略参数和字段在源码中定义顺...原创 2019-08-21 11:03:39 · 1522 阅读 · 0 评论 -
JVM之类文件结构
1.java是一门跨平台的语言,那么跨平台到底是怎么实现的 代码编译的结果 从本地机器码转化为字节码,是存储格式发展的一小步,确实编程语言的一大步。计算机虽然只能识别0和1,但是将编写的程序编译成二进制本地机器码已经不在是唯一的选择,越来越多的程序语言选择了与操作系统和机器指令集无关,平台中立的格式作为程序编译后的存储格式。但是单有储存格式还是不够的,还要有能够运行他的虚拟机,虚拟机并不和任何语...原创 2019-08-13 23:02:24 · 2650 阅读 · 0 评论 -
JAVA虚拟机性能监控与故障处理工具
JDK中包含了一些性能监控与故障处理的工具,可以让我们进一步的了解程序的运行。 一起看一下常用的小工具: jps:虚拟机进行状况工具 他的功能与linux中的ps命令相似,可以列出正在执行的虚拟机进程。 命令格式: jps [ options ] [ hostid ] jps常用参数 选 项 作 ...原创 2019-08-06 19:15:22 · 4132 阅读 · 0 评论 -
JVM垃圾回收算法实现
在JVM对垃圾进行回收的时候,需要对对象进行判断是否还“存活”,因为进行回收的时候需要保证在一致性的快照上进行,需要停顿下来进行垃圾回收。 1.如果对逐渐检查这里边的引用的话,那么必然会消耗大量的时间,怎么去减少这个时间呢? 目前大部分java虚拟机使用的是准确式GC,这样当执行系统停顿下来,并不需要一个不漏地检查完有执行上下文和全局的引用位置。在HotSpot虚拟机中,是使用一种OopMap...原创 2019-08-05 11:52:11 · 353 阅读 · 0 评论 -
jvm垃圾回收机制
在堆中分为新生代,老年代和永久代,在不同的区域中,对应的垃圾回收算法也不同,这些算法都是根据这些区域使用的特性来决定的。 垃圾回收是需要GC线程与程序运行线程配合使用的,在不影响程序运行的前提下,进行垃圾回收的。 标记-清除算法: 思想: 1>.当堆中的有效空间耗尽了,开始stop the world; 2>.标记出所有需要回收的对象(即没有引用...原创 2019-08-04 15:04:42 · 2594 阅读 · 0 评论 -
对象死了吗?
在jvm垃圾回收机制中,回收首先要判断他是不是垃圾,也就是判断这个对象到底死没死? 判断一个对象死没死的核心在于是不是还有其他对象对他进行引用。 通常有下面两种算法来判断: 1.引用计数法: 在对象上加一个引用计数器,如果其他地方对他进行引用,那么引用加一,当引用失效后就减一。当计数器为0后,那么这个对象就不可再用了。 不过这种方法也是有缺点的: 一个对象(A)的一个属性指向另一个对象...原创 2019-08-02 22:37:19 · 4563 阅读 · 0 评论 -
JAVA内存区域与内存溢出
我们知道一台电脑有内存,寄存器,硬盘的存储区域,那么对应JVM虚拟机,也有他自己的存储区域。 1.程序计数器: 这是一块比较小的内存单元,是用来记录程序的运行位置。由于在java虚拟机中的多线程是轮流切换并分配时间的方式来实现的。在任何一个确定的时间,一个内核都会执行一条线程的指令。为了线程切换后能恢复到正确的执行位置,所以每一个线程都需要一个自己的程序计数器,所以程序计数器是线程私有的(...原创 2019-08-02 15:42:44 · 4530 阅读 · 0 评论 -
JAVA对象的创建过程
今天分析一条指令: Demo demo = new Demo(); 这个Demo对象(普通对象)到底是咋来的? 来看一张图: 在图中可以清楚的看到jvm在创建对象时候的执行流程,下面具体讨论一下每个步骤: 在程序进行加载的时候,他的类信息,常量,静态变量等数据就会存放在方法区(常量池)中。 在执行new操作的时候,就会去方法区去寻找我们相应创建类的信息,如果找到的话执行下一步, ...原创 2019-08-01 18:00:16 · 4259 阅读 · 0 评论 -
实践探索JAVA初始化过程
1.JAVA在初始化的时候首先初始化静态代码块(只执行一次),然后非静态代码块,然后构造方法。 2.在各个代码块中顺序执行。 3.在存在继承关系的时候顺序为:父类static -> 子类static -> 父类非static -> 父类构造方法 -> 子类非static ->子类构造方法。 无继承,无层次: public class A { stati...原创 2019-06-22 16:01:15 · 4476 阅读 · 0 评论 -
深入了解JAVA中的锁
1.什么是锁? 锁其实就是一种协议,在对象头中放入一些标志信息用来声明不同的锁。 2.为什么要使用锁? 使用锁的原因就是为了保证数据的一致性。 3.volatile volatile是一种轻量级的synchronized,他保证了并发操作中的共享变量的可见性:即当一个线程修改共享变量的时候,其他线程能读到修改的值。 加上了这个关键字会引发两件事情: 1>.将当前处理器缓存行...原创 2019-06-17 21:02:20 · 4761 阅读 · 0 评论 -
JAVA虚拟机类加载过程
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java对象,这就是虚拟机的类加载机制。 在java中,类的加载,连接和初始化过程都是程序运行期间完成的,这样虽然会使类加载器额外造成一些开销,但是会让java程序有更高的灵活度。 JAVA动态可拓展的特性就是依赖运行期动态加载和动态连接的特点实现的。我们可以编写一...原创 2019-08-26 22:28:20 · 215 阅读 · 0 评论 -
类加载器与加载机制
类加载器: 执行”通过一个类的全限定名来获取描述此类的二进制字节流“这个步骤的代码模块称为“类加载器“,类加载器虽然只用于实现类的加载动作,但是他的作用不是仅限于此,在比较两个类是否”相等“的时候,只有在这两个类是由统一类加载器加载的前提下才有意义。否则,即使两个类源自同一个class文件,但是由不同的类加载器加载出来,他们也是不可能相等的。 类加载器主要有以下几种: 启动类加载器: 一般...原创 2019-08-27 15:28:20 · 124 阅读 · 0 评论 -
看看JVM中的栈是个什么鬼样子
首先,先解释以下虚拟机和物理机的区别: 物理机的执行引擎是直接建立在处理器,硬件,指令集和操作系统层面上的;虚拟机的执行引擎是由自己实现的,可以自己制定指令集和执行引擎的体系结构,并且能够执行那些不被硬件直接支持的指令集格式。 好了,下面来看看运行时栈的信息: 栈帧是用来支持虚拟机进行方法调用和方法执行的数据结构。栈帧中储存着方法的局部变量表,操作数栈,动态连接和方法返回地址等信息,每一...原创 2019-08-29 21:18:26 · 384 阅读 · 0 评论