注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 方法区:回收两样东西 无用的类 废弃的常量 栈和PC寄存器是线程私有区域,不发生GC 2.怎样判断对象是否存活 垃圾回收:回收掉死亡对象所占的内存.判断对象是否死亡,有两种方式: 引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1:引用失效时,计数器值-1 实际中不用,不用的两…
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 方法区:回收两样东西 无用的类 废弃的常量 栈和PC寄存器是线程私有区域,不发生GC 2.怎样判断对象是否存活 垃圾回收:回收掉死亡对象所占的内存.判断对象是否死亡,有两种方式: 引用计数法 每次为对象赋值时,都要…
判断Java对象存活的算法 一.引用计数算法 给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用.这种算法虽然简单,但是有个致命的缺点,就是不能适用于相互引用的情况. 二.可达性分析算法 通过一系列称为"GC Roots"的对象作为起始点,从这些节点往下搜索,搜索走过的路径称为引用链(Reference Chain).当一个对象不在任何引用链上的时候,就表示这个对象不可达,不可用了. 可作为GC Ro…
注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚拟机> 说明:关于JVM内存结构,查看<第一章 JVM内存结构>,下面所讲的JVM内存分配主要是指在Hotspot JVM下新建对象在堆内存中分配的情况. 1.创建一个真正对象的基本过程 五步: 类加载机制检查 JVM首先检查一个new指令的参数是否能在常量池中定位到一个符号引用,并且检查该…
对象的创建 概述 下面简要介绍创建对象的几个重要步骤 : 检查能否在常量池定位到一个类的符号引用,并检查这个符号代表的类是否已被加载,解析和初始化过.如果没有则执行类加载的操作.(即是说对象的引用放在方法区里的) 堆中分配内存,分配有两种方式 指针碰撞(Bump the Pointer)--中间分条线一边已分配,一边未分配 空闲列表(free list)--已分配的空间在一个列表中进行记录 选择哪种分配方式java 堆是否规整决定,而java是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定…
JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为"线程私有"的内存.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址:如果正在执行的是Native方法,这个计数器值则为空(Undefined). 此内存区域是唯一一个在Java…
jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工具已经很强大,几乎涉及了方方面面,但是我们最常使用的只有两款:jconsole.exe和jvisualvm.exe:第三方的分析工具有很多,各自的侧重点不同,比较有代表性的:MAT(Memory Analyzer Tool).GChisto等. jconsole Jconsole(Java Moni…
Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.pool和block三个构成. 第0层 该层指glibc的malloc()这样的分配器,是对OS申请内存的部分. python中如果生成的对象大于256B直接调用malloc,否则直接通过第1.2层分配. 第1层 该层主要管理arena,arena大小固定为256KB,其中保存了arena中开头的poo…
注意:本系列博客,主要参考自以下四本书 <分布式Java应用:基础与实践><深入理解Java虚拟机(第二版)><深入分析Java web技术内幕><实战java虚拟机> 1.为什么要了解JVM内存管理机制 JVM自动的管理内存的分配与回收,这会在不知不觉中浪费很多内存,导致JVM花费很多时间去进行垃圾回收(GC) 内存泄露,导致JVM内存最终不够用 2.JVM内存结构 根据上图,JVM内存结构包括: 方法区(也就是"持久代"),java8…
最近想整理一下GC相关的知识和经验,在整理之前先整理一下jvm的内存结构,后续会持续更新. jvm内存结构重要由两部分组成:线程共享区域与线程私有区域,如下图所示: 其中方法区和堆为线程共享区域,栈与程序计数器为线程私有区域.与操作系统定义的堆栈类似,栈用来存储方法调用时产生的临时变量以及寄存器值,函数的调用伴随着栈帧的开辟及销毁.而堆则是一块较大的内存区域由各线程共享,像对象.常量等jvm进程拥有的资源在堆中由各线程共享. 方法区 方法区也是线程共享区,用于存储虚拟机加载的类信息(instan…