深入理解JVM虚拟机
kukubao207
stay hungry,stay foolish
展开
-
Java内存模型
一、JVM运行时的数据区域 Java虚拟机在Java程序执行的过程中会把它所管理的内存分成若干个不同的数据区域。 包括: 1.程序计数器(Program Counter Register) 我们知道,Java是一次编译,到处运行的一种语言。 这种跨平台特性是基于Java的.class文件字节码实现的。 第一次编译: Java源程序 => .class文件字节码(可以到处运行...原创 2019-01-24 21:14:00 · 177 阅读 · 0 评论 -
Java垃圾收集器与内存分配策略
1 概述 哪些内存需要回收? 什么时候回收? 如何回收? Java垃圾回收主要关注的是堆和方法区。 2 Java如何判断对象存活? 有种算法是引用计数算法,给每一个对象添加一个引用计数器,每当有一个地方引用他,计数器值+1,引用失效时,计数器值-1。 任何时刻计数器为0的对象就是不可能在被使用的。但这种算法无法解决循环引用的问题。 因此Java是通过可达性分析算法来判定对象是否存活...原创 2019-01-28 19:42:26 · 135 阅读 · 0 评论 -
深入理解Java虚拟机(三)内存分配与回收策略
对象的内存分配,从大方向上来,就是分配在堆上。 堆中有新生代和老年代,绝大多数情况下对象被分配在新生代的Eden区上,少数情况下也会直接分配在老年代上,这取决于所采取的具体的垃圾收集器组合和虚拟机中内存相关参数的配置。 内存分配的通用规则 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 ...原创 2019-04-04 19:57:20 · 148 阅读 · 0 评论 -
深入理解Java虚拟机(一)内存区域划分
Java虚拟机管理的内存包括以下几个运行时数据区 一、程序计数器 线程私有 指示当前线程所执行到的字节码的行号。 因为Java会有多线程切换,从老线程切换到某个新线程时,需要知道新线程当前已经执行到哪里了,也需要保存老线程已经执行到哪了,方便以后切回去的时候继续往下执行。 二、虚拟机栈 线程私有 每一个方法的执行到完成对应一个帧栈在虚拟机栈中的入栈到出栈的过程。 帧栈中保存方法的局部变量表、...原创 2019-04-03 10:44:07 · 117 阅读 · 0 评论 -
深入理解Java虚拟机(二)垃圾回收
一、判断对象存活、GC Roots、引用 引用计数算法 可达性分析算法(从GC Roots出发,搜索关联结点,回收不可达对象) GC Roots包含的对象 虚拟机栈的局部变量表中refenrence引用的对象 本地方法栈中JNI引用的对象 方法区中类变量引用的对象 方法区中常量引用的对象 Java中的引用类型 强引用:强引用引用的对象不可回收 软引用:软引用引用的对象在内存溢出发生之前被...原创 2019-04-03 16:54:06 · 133 阅读 · 0 评论