http://longdick.iteye.com/blog/468368 先看一下JVM的内存模型: 从大的方面来讲,JVM的内存模型分为两大块: 永久区内存( Permanent space )和堆内存(heap space). 栈内存(stack space)一般都不归在JVM内存模型中,因为栈内存属于线程级别. 每个线程都有个独立的栈内存空间. Permanent space里存放加载的Class类级对象如class本身,method,field等等. heap space主要存放对象实…
GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 引用计数算法 给对象中添维护一个计数器,每当引用这个对象时,计数器加1:当引用失效时,计数器值减1:当计数器值为0时,表示这个对象没有被使用. 无法解决对象间相互引用的问题. 可达性分析算法 这个算法的基本思路就是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连 (用图论的话来…
可回收对象的判断方法 1.引用计数算法 2.可达性分析算法 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 引用计数算法的缺陷:循环引用 可达性分析算法 可达性分析算法基本原理: 通过一些列的称为“GC Roots”的对象作为起始点,从这些节点开始进行向下搜索,搜索 所走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有任何引用连(用图论的话来说就是…
一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的.这也就是需要回收的对象,简单地说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可回收的对象. 引用计数法是对象记录自己被多少程序引用,引用计数为零的对象将被清除…
JVM内存模型 JVM内存模型可以分为两个部分,如下图所示,堆和方法区是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的.   1. 堆(Heap) 堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代.下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除. 堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中).其大小通过-Xms…
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃圾回收功能 数据下标越界越界检查 多态 比较 Jvm vs Jre vs JDK 1.2 学习路线 本文主要讲解的是HotSpot VM HotSpot VM 是目前市面上高性能虚拟机的代表作之一,采用解释器与即时编译器并存的架构 学习主要分为三个部分 此文为第一篇 内存与垃圾回收篇 JVM概述 类…
JVM与Java体系结构 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了 每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC.OOM等问题,一脸懵逼. 大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java…
堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域. Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了.是 JVM 管理的最大一块内存空间. 堆内存的大小是可以调节的. <Java 虚拟机规范>规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的. 所有的线程共享 Java 堆,在这里还可以划分线程私有…
方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈.堆.方法区的交互关系 下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存放在 Java 栈的局部变量表中 new Person():存放在 Java 堆中 方法区的理解 <Java 虚拟机规范>中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单…