深入理解Java虚拟机之读书笔记一 自动内存管理机制
一、运行时数据区域
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虚拟机之读书笔记一 自动内存管理机制的更多相关文章
- 《深入理解java虚拟机》读书笔记——垃圾收集与内存分配策略
可回收判定两种算法 引用计数法(Reference Counting):引用为0时可回收. 可达性分析法(Reachability Analysis): 从GCRoots对象到这个对象不可达. GCR ...
- 《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常
前言 最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的-- 内景.家里 - 下午 我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本 ...
- 《深入理解java虚拟机》读书笔记-第二章Java内存区域和内存溢出异常
java1.7和java8的jvm存在差异,本文先按照<深入理解java虚拟机>的讲解内容总结,并将java8的改变作为附录放在文末 一丶运行时数据区域 图:java虚拟机运行时数据区 ...
- 《深入理解java虚拟机》读书笔记七——第八章
第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...
- 《深入理解java虚拟机》读书笔记五——第六章
第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...
- 《深入理解Java虚拟机》读书笔记七
第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...
- 《深入理解Java虚拟机》读书笔记五
第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...
- 《深入理解 Java 虚拟机》读书笔记:类文件结构
正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联, ...
- 《深入理解 Java 虚拟机》读书笔记
第二章 Java 内存区域与内存溢出溢出 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的 ...
随机推荐
- python group()
正则表达式中,group()用来提出分组截获的字符串,()用来分组 #!/usr/bin/python import re line = "Cats are smarter than dog ...
- Mysql数据库设置定时任务
最近手头在做一个拍卖的电商项目. 中间需要将到点的拍卖会状态设置为进行中. 我们的解决方案是Mysql的定时器任务,这里进行一个简单的总结. 1.使用范围 不是所有的MySQL版本都支持,Mysql ...
- 纯css3实现旋转的太极图
效果图: 代码如下: <!DOCTYPE html> <html> <head lang="zh"> <meta charset=&quo ...
- C#的两个大方向
http://zhidao.baidu.com/link?url=wG9G_EaT3tRd5_7ndU3vpFqmuc6S8N7F5TpBYsDPEui3HQ-wcU7nqw-_aRpIwtXQbC3 ...
- _mkdir
[内容摘要]: C语言 在VS2013环境下使用_mkdir返回值是-,而且文件夹不存在,#include stdio.h#include direct.hmain(){)printf("无 ...
- Linux下多线程下载工具 - Axel
Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...
- 初识Hadoop二,文件操作
1.使用hadoop命令查看hdfs下文件 [root@localhost hadoop-2.7.3]# hadoop fs -ls hdfs://192.168.36.134:9000/ 开始在se ...
- CSS学习笔记——选择器
选择器 当我们定义一条样式规则时候,这条样式规则会作用于网页当中的某些元素,而我们的规定的这些元素的规则就叫做选择器. 常用的选择器: 1.id选择器 #idname 2.类选择器 .classnam ...
- Linux学习笔记(一)2015.4.13
研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...
- MONO加载DLL调试命令
http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/ http://www.mono-project.com/ ...