一、运行时数据区域

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. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  2. DNS(企业级)

    构建DNS(企业级) 1.硬件选型 CPU:12C以上配置 内存:16G 网络:千兆 2.初始化系统配置 关闭 iptables service iptables stop chkconfig ipt ...

  3. 深入JVM-有关String的内存泄漏

    什么是内存泄漏?所谓内存泄漏,就是由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,他并不是说物理内存消失了,而是指由于不再使用的对象占据了内存不被释放,而导致可用内存不断减小,最终有可能导致内 ...

  4. uC/OS-II内存(OS_mem)块

    /*************************************************************************************************** ...

  5. aircrack-ng test

    Aircrack-ng工具包有很多工具,我用到的工具主要有以下几个: airmon-ng 处理网卡工作模式 airodump-ng 抓包 aircrack-ng 破解 aireplay-ng 发包,干 ...

  6. Array subscript is not an integer

    字典的字母写成大写了,也不能查成出来,没有报没有这个字典,反而报这个错……找了好久

  7. IOS: 账号,证书 好文整理

    公钥.私钥.数字证书的概念 http://blog.csdn.net/turui/article/details/2048582 iOS Provisioning Profile(Certificat ...

  8. php常用时间戳记录

    <?php echo '<br/>'; //php获取今日开始时间戳和结束时间戳 echo "今天"; echo '<br/>'; $beginTod ...

  9. IPcamera

    1.IPcamera 一般架构 IPcamera产品其实是一个小型的对外直播系统,一般通过rtsp协议将音视频数据传输到PC端播放器,通过rtmp协议将音视频数据传输到移动端播放器,当然有些还支持P2 ...

  10. [C#]System.Timers.Timer

    摘要 在.Net中有几种定时器,最喜欢用的是System.Timers命名空间下的定时器,使用起来比较简单,作为定时任务,有Quartz.net,但有时候,一个非常简单的任务,不想引入这个定时任务框架 ...