JVM
一笑而过者也
爱好java,分布式开发
展开
-
OutOfMemory问题定位
内存溢出定位程序加入启动参数-Xms30M -Xmx30M -XX:+HeapDumpOnOutOfMemoryError加入下面代码 while (true) { //0.5M byte[] chars = new byte[1024 * 512]; list.add(chars); Thread.sleep(1500); }OOM时会打印java_pid...原创 2020-03-07 13:49:16 · 616 阅读 · 0 评论 -
HotSpot的算法实现
枚举根节点 由于目前的主流Java虚拟机使用的都是准确式GC,当执行系统停顿下来后,并不需要一个不漏地检查完所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知哪些地方存放着对象引用。 在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记...原创 2020-02-08 12:31:37 · 429 阅读 · 0 评论 -
垃圾收集算法
标记-清除算法 Mark-Sweep 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 由两个不足:效率问题标记和清除两个过程的效率都不高空间问题标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。复制算法 为了解决效率问题,一种称为...原创 2020-02-08 12:24:13 · 123 阅读 · 1 评论 -
回收方法区
主要回收两部分内容:废弃的常量和无用的类。 回收废弃常量:与回收Java堆中的对象非常类似。以常量池中字面量的回收为例,假如一个字符串"abc"已经进入了常量池中,但是当前系统没有任何一个String对象是叫做"abc"的,换句话说,就是没有任何String对象引用常量池中的"abc"常量,也没有其他地方引用了这个字面量,如果这时发生内存回收,而且必要的话,这个"abc"常量就会被系统清理...原创 2020-02-08 12:14:11 · 193 阅读 · 0 评论 -
引用类型
强引用 强引用就是指在程序代码之中普遍存在的,类似"Object obj=new Object()"这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。软引用 软引用是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2...原创 2020-02-08 12:06:30 · 121 阅读 · 0 评论 -
判断对象是否存活
引用计数法 互相引用会无法回收可达性分析法 通过一系列的GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 可作为GC Roots的对象:虚拟机栈(栈帧中本地变量表)中引用的对象方法区中类静态属性引用的对象方法区中常量引用的对...原创 2020-02-08 11:53:53 · 123 阅读 · 0 评论 -
对象的访问定位
建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用句柄和指针两种。 1. 如果使用句柄访问的话,那么Java堆中将会划分出一块内存来作为...原创 2020-02-08 11:44:13 · 111 阅读 · 0 评论 -
对象的内存布局
在HotSpot虚拟机中对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对其填充(Padding)对象头 对象头包括三部分第一部分Mark Word,用于存储对象自身的运行时数据,哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。这部分数据在长度为32位和64位的虚拟机中分别为32bit和64bi...原创 2020-02-08 11:36:20 · 115 阅读 · 0 评论 -
对象的创建过程
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须执行相应的类加载过程。类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存的大小在类加载完成后便可完全确定。内存分配又有两种方式:指针碰撞(Bump the Pointer)和空闲列表(Free List)。选...原创 2020-02-08 11:28:47 · 170 阅读 · 0 评论 -
运行时数据区
程序计数器 Program Counter Register 在虚拟机概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。 线程私有,此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 如果线程正在执行的是一个java方法,这个计...原创 2020-02-08 10:53:53 · 99 阅读 · 0 评论