一、运行时数据区域

1、程序计数器是线程的私有空间,每个线程都有。针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址;Native代码时:计数值为Undefined。不可能出现OutOfMemeoryError情况。

2、Java虚拟机栈是线程的私有空间,每个线程都有。栈中局部变量表的部分是在编译期间完成分配的,每个局部变量空间的大小为32为长度。栈的深度太长,抛出StackOverflowError异常。栈可扩展时,如果内存不够,会抛出OutOfMemoryError异常。

3、本地方法栈与Java虚拟机栈作用类似,区别在于它为Native方法服务。

4、Java堆被所有线程共享的一块内存区域,在虚拟机启动的时候创建。可能抛出OutOfMemoryError异常。

5、方法区也是被所有线程共享的一块内存区域。主要存储类信息、常量、静态变量和及时编译器编译后的代码等。同样需要垃圾回收,主要是常量池的回收和类型的卸载。可能抛出OutOfMemory异常。

6、运行时常量池是方法区的一部分。Class文件中会包含类的版本、字段等信息,还有常量池。常量池用于存放编译器生成的各种字面量和符号引用,在类被加载时加载到方法区的运行时常量池中。运行期间也可将新的常量放入池中,比如String类的intern()方法。

7、直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中的定义的内存区域。可能抛出OutOfMemoryError异常。NIO方式中,使用Native函数库直接分配堆外内存,通过Java堆中的DirectByteBuffer对象作为其引用进行操作,避免了Java堆和Native堆之间的来回复制,提高了性能。

二、对象访问

1、对象的访问有两种主流的方式:使用句柄和直接指针。

三、实战:OutOfMemoryError异常

1、Java堆溢出:异常堆栈信息是:java.lang.OutOfMemoryError: Java heap space。

解决思路:使用内存分析工具(Eclipse Memory Analyzer)对dump出来的堆转储快照进行分析,确定是内存泄露还是内存溢出。如果是内存泄漏:使用工具查看泄漏对象到GC Roots的应用链。如果是内存溢出:检查虚拟机的堆参数与机器物理内存的对比,检查代码中某些大对象是否生命周期过长等。

2、虚拟机栈和本地方法栈溢出:栈帧太大和栈层次太多,当内存无法分配的时候产生StackOverflowError异常。当多线程无法建立自己的栈时才会抛出OutOfMemoryError异常。

3、运行时常量池溢出:运行时向常量池添加内容,最简单的做法是String.intern()方法。

4、方法区溢出:如果有动态产生类的行为,可能溢出。

5、本机直接内存溢出:默认大小等于Java堆的最大值。

深入理解Java虚拟机之读书笔记一 自动内存管理机制的更多相关文章

  1. 《深入理解java虚拟机》读书笔记——垃圾收集与内存分配策略

    可回收判定两种算法 引用计数法(Reference Counting):引用为0时可回收. 可达性分析法(Reachability Analysis): 从GCRoots对象到这个对象不可达. GCR ...

  2. 《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常

    前言 最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的-- 内景.家里 - 下午 我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本 ...

  3. 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常

    java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 ​ 图:java虚拟机运行时数据区 ...

  4. 《深入理解java虚拟机》读书笔记七——第八章

    第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...

  5. 《深入理解java虚拟机》读书笔记五——第六章

    第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...

  6. 《深入理解Java虚拟机》读书笔记七

    第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...

  7. 《深入理解Java虚拟机》读书笔记五

    第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...

  8. 《深入理解 Java 虚拟机》读书笔记:类文件结构

    正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联, ...

  9. 《深入理解 Java 虚拟机》读书笔记

    第二章 Java 内存区域与内存溢出溢出 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的 ...

随机推荐

  1. 2 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之MySql的搭建

    preface 上一节我们讲了DRBD的原理,以及如何部署DRBD,那么现在在上一节的基础上部署Mysql 安装并启动Mysql 为了方便,我一般采用yum安装Mysql.命令如下: 在172.16. ...

  2. oneM2M

    http://www.ccsa.org.cn/organization/intro.php?org=oneM2M 一.成立背景 随着物联网技术研发及市场推广的不断深入,全球各通信标准化组织都在加强物联 ...

  3. PHPCMS后台统计点击量时出现点击数不改变可能丢失了JS代码。

    <script language="JavaScript" src="{APP_PATH}api.php?op=count&id={$id}&mod ...

  4. java 类的静态变量

    主要是记录一个奇葩的现象,java类中的静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类. 类中的静态变量是存储在JVM方 ...

  5. Latex 表格内公式换行方法

    Latex 表格内的公式实现换行的方法       简单的两步走:   1.先将下面的语句放在latex正文的导言区: \newcommand{\tabincell}[2]{\begin{tabula ...

  6. Lua 之table库

    标准table库 table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写,table.concat()函数列出参数中指定 ...

  7. yii2.0自动登录功能的实现方法

    参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...

  8. STM32堆栈溢出

    在使用STM32读取SD Card的文件时,总是会卡死在读函数那里 res = f_read(&fsrc, gbuffer, sizeof(gbuffer)-1, &br); 而且出现 ...

  9. 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)

    相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已.我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的. ...

  10. jquery mobile常用的data-role类型 data-icon data-iconpos

    文章链接: http://blog.csdn.net/cainiaoxiaozhou/article/details/48521241