深入理解Java虚拟机:JVM高级特性与最佳实践(一):java 内存区域与内存异常

如需转载,请标明转自何处

运行时数据区域:

java 虚拟机在执行java程序的过程中会把他管理的内存化为若干个不同的数据区域。这些区域都有各自的用途,销毁与创建的时间,有的区域随着进程的启动而存在,有的则依赖用户的线程的启动和结束而创建和销毁,java虚拟机管理的内存分为一下几个数据区域:

1、程序计数器:当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理线程恢复都依赖与它。

java 虚拟机的多线程是通过线程的轮流切换并分配处理器执行时间的方式来实现的。为了线程切换后能回到正确的执行位置,每条线程都需要一个程序计数器,各个线程的计数器相互不影响。

2、java虚拟机栈:线程私有的,生命周期与线程相同。每个方法执行的时候都会创建一个栈桢。用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法从被调用直至执行完的过程,就对应着一个栈桢在虚拟机栈中从入栈到出栈的过程。我们在学校老师讲的栈实际上就是虚拟机栈或者说是虚拟机栈中的局部变量表部分。

64位的long 和double 占用两个局部变量空间,其余的只占用一个,局部变量表所需要的内存空间在编译期间完成分配。

栈桢是方法运行期的基础数据结构。

3、本地方法栈:与虚拟机栈区别是:虚拟机栈是虚拟机执行方法(字节码)服务,而本地方方法栈是虚拟机用到的native服务。

4、java堆:java堆是所有线程共享的一片区域,虚拟机启动的时候创建,此区域存放对象的实例。若过从内存回收的角度上来看,java堆可以细分为新生代和老年代。

5、方法区:各个线程共享的一片内存区域,用来存放已被虚拟机所加载的类信息、常量、静态变量、即时编译器编译后的java代码,如果从内存回收的角度上来看方法区被叫做永久带,垃圾回收行为在这个区域是很少出现的。这个区域的内存回收目标主要针对常量池的回收和对类型的卸载。

6、运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将被类加载后存放到方法区内的运行时常量池中。

7、直接内存:并不是虚拟机运行时区域的一部分,也不是java的内存区域

实战OutOfMemoryError异常:

java堆溢出:java堆内存中的OOM异常,一般的手段首先是通过内存镜像分析工具如(Eclipse Memory Analyzer)对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否有必要的,如果不存在泄漏,检查虚拟机的堆参数(-Xmx 与 -Xms),从代码上检查是否存在某些对象生命周期过长、持有状态时间过长。

虚拟机栈和本地方法栈OOM:

栈容量只是由-Xss参数设定的

运行时常量池OOM:

我们可以通过-XX:permSize 和-XX:MaxPermSize限制方法区的大小。

方法区OOM:

方法区主要存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述。

我们用到的spring 或者hibernate对类进行增强时都会用到cglib技术,增强的类越多,就需要越大的方法区来保证动态生成的Class可以被载入到内存

本机直接内存溢出:

这个没搞明白,希望读者能够补充

时间: 2024-10-16 18:19:25

深入理解Java虚拟机:JVM高级特性与最佳实践(一):java 内存区域与内存异常的相关文章

挑战高薪必看:《深入理解java虚拟机 jvm高级特性与最佳实践》

Java是目前用户最多.使用范围最广的软件开发技术之一.Java 的技术体系主要由支撑 Java程序运行的虚拟机.提供各开发领域接口支持的Java API.Java 编程语言及许多第三方 Java框架(如Spring.Struts 等)构成.在国内,有关Java API.Java语言语法及第三方框 架的技术资料和书籍非常丰富,相比之下,有关Java虚拟机的资料却显得异常贫乏. 资料获取方法 内容特色 第一部分走近 Java 本书的第部分为后文的讲解建立了良好的基础.尽管了解Java技术的来龙去脉

《深入理解Java虚拟机:JVM高级特性与最佳实践》学习笔记 Ⅲ 虚拟机执行子系统

第三部分 虚拟机执行子系统第6章 类文件结构//实现语言无关性的基础仍然是虚拟机和字节码存储格式,使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合Class文件应有的结构就可以在Java虚拟机中运行.1.Class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有分隔符.Cl

《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区     1:程序计数器(Program Counter Register),也称"PC寄存器" A:用来指示需要执行哪条指令的.(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.) B:由于在JVM中,多线程

深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载

网盘下载地址:深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载 – 易分享电子书PDF资源网 作者: 周志明 出版社: 机械工业出版社 副标题: JVM高级特性与最佳实践 出版年: 2013-9-1 页数: 433 定价: 79.00元 装帧: 平装 内容简介 · · · · · · <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公

深入java虚拟机-jvm高级特性和实战

第一部分 走近java 第一章 java技术体系 官方所定义的java技术体系 java程序设计语言 各硬件平台上的java虚拟机 Class文件格式 java api类库 来自商业机构和开源社区的第三方java类库 我们可以把java程序设计语言.java虚拟机.java api类库这三部分统称为JDK,是用于支持java程序开发的 最小环境把java api类库总的javaSE api子集和java虚拟机统称为JRE,是支持java程序运行的标准环境. 第二部分 自动内存管理机制 第二章 内

《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

第一部分 走进Java 一.走进Java 1.概述 java广泛应用于嵌入式系统.移动终端.企业服务器.大型机等各种场合,摆脱了硬件平台的束缚,实现了"一次编写,到处运行"的理想 2.java技术体系结构 按照功能来划分 包括以下几个组成部分:Java程序设计语言,各种硬件平台的java虚拟机,Java API类库,来自商业机构和开源社区的第三方Java类库,Class文件格式 Java程序设计语言,java虚拟机,Java API类库统称为JDK,是用于支持java程序开发的最小环境

《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)

第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 OpenJDK 中所带的虚拟机,最初并不是Sun开发 Sun Mobile- Embedded VM/ Meta- Circular VM BEA JRockit/ IBM J9 VM JRockit曾号称世界上最快的java虚拟机,BEA公司发布.J9属于IBM主要扶持的虚拟机 Azul VM/ BEA

深入理解JVM读书笔记一: Java内存区域与内存溢出异常

Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区. 2.2 运行时数据区域 2.2.1程序计数器 程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器.字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚

深入理解jvm之内存区域与内存溢出

文章目录 1. Java内存区域与内存溢出异常 1.1. 运行时数据区域 1.1.1. 程序计数器 1.1.2. java虚拟机栈 1.1.3. 本地方法栈 1.1.4. Java堆(Java Heap) 1.1.5. 方法区 1.1.6. 运行时常量池 1.1.7. 直接内存 1.2. HotSpot虚拟机 1.2.1. 对象的创建 1.2.2. 对象的访问定位 1.3. OOM异常的解决思路 1.4. 参考 Java内存区域与内存溢出异常 运行时数据区域 程序计数器 当前线程所执行的字节码的