一、运行时数据区域

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. BZOJ2458: [BeiJing2011]最小三角形

    类似分治最近点对的方法乱搞一下就行. #include<bits/stdc++.h> #define N 200010 #define M (s+t>>1) using nam ...

  2. MyEclipse快捷键大全(绝对全)

    存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了) 代码辅助 Alt+/ 快速修复 Ctrl+1 代码格式化 Ctrl+Shi ...

  3. Docker create image

    Dockerfile FROM java:8 MAINTAINER dudu ADD springts_1-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPO ...

  4. Ubuntu打开终端的方法三种

    这个不应该称得上是一个问题,但是,发现对于新手,确实是个难题因为少有人能够提到这一点,基本都是上来就直接讲用到的命令.我开始的时候也曾经被这个问题困扰着,后来,搜了一会儿才弄明白.1.在菜单内的附件上 ...

  5. Foundation框架--字典( NSDictionary NSMutableDictionary )

    基础知识 1.字典不允许相同的key,但允许有相同的value. 2,字典是无序的,字典不能排序. 3.字典里的内容是成对存在的,不会出现单数. 4.快速创建的方式只适合不可变字典. 不可变字典 #i ...

  6. Robot Framework--07 变量的声明、赋值及其使用

    转自:http://blog.csdn.net/tulituqi/article/details/7984642 一.变量的声明 1.变量标识符 每个变量都可以用  变量标识符{变量名}    来进行 ...

  7. 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...

  8. springmvc 注解总结

    1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所 ...

  9. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  10. mysql存储过程对900w数据进行操作测试

    新增索引:LTER TABLE `tablename` ADD INDEX `sdhid` (`createTime`) USING BTREE ;[SQL]ALTER TABLE `tablenam ...