原文地址:http://blog.csdn.net/hanekawa/article/details/51972259 第二章 Java内存区域与内存溢出异常 一,运行时数据区域: 1.        程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一跳需要执行的字节码指令.如果执行的是native方法,这个计数器的值则为空. 2.        Java虚拟机栈 线程私有,生命周期与线程相同.描述的是java方法执行的内存模型:每个方法在执行…
xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自<_深入理解Java虚拟机_JVM高级特性与最佳实践 第2版_220_>,博主完全尊重书籍原创,只是学习笔记摘抄部分,由于不是原创,不支持转载.如有侵权请联系博主(微信号:t2421499075). > Java是一门面向对象的编程语言,在程序运行过程中每时每刻都有对象被创建,我们在写代码的…
@TOC 对象在内存中如何储存 对象访问在java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及到java栈,java堆,方法去三个最重要的内存区域的关联关系,比如下面这段代码: Object ocj =new Object(); 假设这句代码出现在方法体中,那Object obj这部分的语义将会放映到java的本地变量表中作为一个reference1类型出现.而==new Object()==这部分的语义将会反映到java堆中,形成了一块储存了Object类型所有实例数据值…
垃圾收集:垃圾收集要完成三件事,包括哪些内存需要回收,什么时候回收及如何回收. 1.需要回收的内存判定:没有引用指向原先分配给某个对象的内存时,则该内存是需要回收的垃圾 Java垃圾收集器在对内存进行回收之前,首先就是要确定这些对象哪些已经"死去",对已经"死去"的对象进行内存回收. 目前,确定对象是否存活的主流算法有: 1)引用计数算法: 所谓引用计数算法,即给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1:当引用失效时,计数器值就减1:任何时…
做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加一个引用计数器,当程序中使用到这个对象的时候,计数器+1:如果引用失效,计数器-1,当计数器为0时,说明程序中不再使用这个对象,既可以回收.问题:试想一下,当A对象中使用B对象,B对象中有方法使用A对象,完犊子,两个对象永远存在. 2.可达性分析算法(主流的商用程序语言的主流实现,都是基于此算法)通…
http://chenzhou123520.iteye.com/category/196061 转载 JVM学习笔记(一):运行时数据区 JVM学习笔记(二):JVM中对象访问的两种方式 JVM学习笔记(三):JVM的垃圾回收 JVM学习笔记(四):Class文件结构 JVM学习笔记(五):根据字节码指令介绍方法执行流程 JVM学习笔记(六):类加载的时机 JVM学习笔记(七):类加载的过程…
运行时数据区域 1.线程独有的内存区域 PROGRAM COUNTER REGISTER 程序计数器 程序计数器空间较小,是当前线程执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令. 如果线程执行的是Java方法,记录的是正在执行的虚拟机字节码指令的地址:如果执行的是Native方法,则为空 VM Stack 虚拟机栈 虚拟机栈生命周期与线程相同.每个Java方法执行时都会创建…
Java堆OOM(Out-Of-Memory)异常 执行例如以下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space /** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @author zzm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args…
对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行相应的类加载过程: 根据方法区中该类的信息确定对象的所需空间大小: 虚拟机为新生对象分配内存: 将对象实例的内存(不包括对象头)进行初始化为零值: 配置对象头的信息: 调用对象的构造函数进行初始化. 这样,一个真正可用的对象被完全构造出来了. 多线程中,引用指向对象的内存空间和对象初始化操作可能会出…
对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object…