一、运行时数据区域

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. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  2. wpf 线程

    一.线程概述:[引用MSDN] 通常,WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI.呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入.处理事件.绘制屏幕以及运行应用程序代 ...

  3. c++ operator

    这篇博文是以前很久写的,贴在我的早期一个blog中,今天google一下,发现还真有不少人转载,可惜并不注明出处.那时觉得operator比较好玩.C++有时它的确是个耐玩的东东.operator它有 ...

  4. jquery 解析数据库中的json日期为正常的格式

    //在action从后台数据库中请求获得日期以后,得到的是json格式的数据,因此要解析才能显示在前台1.在jsp页面写的代码如下:<html> <script> Date.p ...

  5. IDEA 搭建的SpringMVC Maven项目出现的问题

    1.添加jar包时,报添加某个jar包有问题,在pom.xml文件的project节点上有红波浪线 jar引用的maven地址没有问题,就是报错 解决办法:到本地仓库把相关jar包删掉重新下载 2.各 ...

  6. jQuery学习笔记——弹出对话框

    引用jQuery库文件的<script>标签,必须放在引用自定义脚本文件的<script>标签之前.否则,在编写的代码中将不能引用到jQuery框架 <script ty ...

  7. hdu 1020 Encoding

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Given a ...

  8. $().index() 两种用法

    第一种:获得第一个 p 元素的名称和值: $(this).index() <script type="text/javascript"> $(document).rea ...

  9. Rendering Paths

    渲染路径 Rendering Paths http://game.ceeger.com/Manual/RenderingPaths.html 延迟光照渲染路径的细节 Deferred Lighting ...

  10. Logback LogBack

    1.简介 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的) 1.1 LogBac ...