java内存分析
来源:互联网 发布:合肥it 编辑:程序博客网 时间:2024/06/05 17:10
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,
VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 ),其中Method Area 和
Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。为什么分为
线程共享和非线程共享的呢?请继续往下看。首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,
会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,
再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?概括地说来,JVM初始运行
的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter
Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈)。
当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分
为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的
生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。
Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:
所有的对象实例以及数组都要在堆上分配,但是随着技术的发展,对象分配在堆上已经变得不那么“绝对”了。heap(堆)划分为
三部分:young generation(新生代)、tenured generation (old generation)(旧生代)、permanent generation(永生代)。
字符串为了解决字符串重复问题,生命周期长,存于pergmen中。
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,当虚拟机装载一个class文件时,它会从这个class文件包含
的二进制数据中解析类型信息,然后把这些类型信息(包括类信息、常量、静态变量等)放到方法区中。
运行时常量池(Runtime Constant Pool)是方法区的一部分。
Java虚拟机栈(VM Stack)描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、
操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用
(reference类型)。 Java虚拟机栈可能出现两种类型的异常:
1. 线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。
2.虚拟机栈空间可以动态扩展,当动态扩展是无法申请到足够的空间时,抛出OutOfMemory异常。
本地方法栈(Native Stack):本地方法栈和虚拟机栈基本类似,只不过Java虚拟机栈执行的是Java代码(字节码),
本地方法栈中执行的是本地方法的服务。本地方法栈中也会抛出StackOverflowError和OutOfMemory异常。
程序计数器(Program Count Register):又叫程序寄存器。JVM支持多个线程同时运行,当每一个新线程被创建时,它都
将得到它自己的PC寄存器(程序计数器)。如果线程正在执行的是一个Java方法(非native),那么PC寄存器的值将总是
指向下一条将被执行的指令,如果方法是 native的,程序计数器寄存器的值不会被定义。 JVM的程序计数器寄存器的宽度
足够保证可以持有一个返回地址或者native的指针。
- Java的内存分析
- Java内存分析图
- Java内存分析小节
- Java 程序内存分析
- Java 程序内存分析
- Java 内存溢出分析
- java内存分析
- java内存分析
- java内存分析【精辟】
- JAVA内存分析笔记
- java内存模型分析
- Java内存分析
- java的内存分析
- JAVA基础--内存分析
- java内存分析
- Java内存管理分析
- Java内存泄漏分析
- java内存原型分析
- FlatBuffers学习总结
- ffmpeg在VS2013中的配置
- 将自制网格制作为预制体
- Android Studio JNI 开发.so库
- WebSocket在容器化管理平台的应用
- java内存分析
- 【微信小程序】微信开发者工具的使用
- 使用DOM解析XML
- 查找------B树、Trie树
- 机器学习
- 基于Android VideoView播放器的封装
- BZOJ 3209 花神的数论题
- 浅谈 Spring 框架注解的用法分析
- 视图的作用