随笔分类 - 深入java虚拟机
摘要:Class类文件的结构 全局规范 1.任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。本章中,只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class文件格式”,实际上它并不一定以磁盘文件的形
阅读全文
摘要:一、java体系结构 二、class格式文件概述 class文件是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得class文件非常紧凑, 体积轻巧, 可以被JVM快速的加载至内存, 并且占据较少的内存空间。 我们的Java源文件, 在被编译之
阅读全文
摘要:一、案例 监控线程情况,包括阻塞、死循环等 1.1 代码如下,下述代码共有三个线程,Main、mythread01、mythread02线程,其中mythread01线程为死循环、mythread02为阻塞线程 运行程序,打开jconsole,结果如下图,此时只有main线程,且该线程状态为Runa
阅读全文
摘要:一、什么是逃逸? 逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,
阅读全文
摘要:在虚拟机中,我们知道对象的内存是分配在堆中的。但是堆又可以划分为更小的区域以便垃圾回收,那么,对象到底是怎么在分配在堆中的呢? 一:堆中优先分配Eden 大多数情况下,对象都在新生代的Eden区中分配内存。而因为大部分的对象都是“朝生夕死”的,所以新生代又会频繁进行垃圾回收。 1.1 案例 结果 首
阅读全文
摘要:一、垃圾收集器之Serial serial收集器 serial收集器 serial收集器是最基本发展最悠久的收集器。serial收集器是一个单线程的收集器,但他的“单线程”的意义并不仅仅只会使用一个cpu或者一条线程去完成垃圾收集工作,更重要的是在他进行垃圾收集时,必须暂停其他所有的工作线程,直到收
阅读全文
摘要:一、标记-清除算法 1) 标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经基本介绍过了。之所以说它是最
阅读全文
摘要:一、垃圾回收总览 二、判定垃圾对象之引用计数法 引用计数器算法算是一种古老的java垃圾回收算法,目前很多版本的java(jdk1.8也已废弃)已经废弃掉这种算法了。 定义:给每个对象分配一个计算器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计算器为0
阅读全文
摘要:在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 一、 对象头 HotSpot虚拟机的对象头包括两部分信息: 第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCod
阅读全文
摘要:一、内存管理 二、线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理
阅读全文
摘要:一、概念 Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个区域是用来存放对象实例的,几乎所有对象实例都会在这里分配内存。堆是Java垃圾收集器管理的主要区域(GC堆),垃圾收集器实现了对象的自动销毁。Java堆可以细分为:新生代和老年代;再细致一点的有Eden空间,From Su
阅读全文
摘要:一、内存溢出程序 当程序运行起来后一段时间内存就会溢出。 二、查看内存溢出情况 2.1 安装内存分析工具 2.2 运行参数配置 Run as-->Run Configurations-->Arguments-->VM arguments:-Xms20m -Xmx20m -XX:+HeapDumpOn
阅读全文