深入理解java虚拟机-java内存区域与内存溢出异常

线程 运行数据区分为线程共享区和线程独占区

线程独占区的意思是每开启一个线程就会拥有一个线程独占区域

如下图所示:

程序计数器:

1)是一块较小的内存空间,可看做当前线程所执行的字节码的行号指示器

2)它处于线程独占区(每一个线程都会有自己的线程独占区)

3)如果线程执行的是java方法,这个计数器记录的就是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法,这个计数器的值为undefined

4) 此区域是唯一一个在java虚拟机规范中没有规定任何OutofMemory的情况的区域(开发者不操作程序计数器,由java虚拟机内部维护)

java虚拟机栈:

1)描述的是java方法执行的动态内存模型

2)栈帧:每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成。

栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等。

3) 局部变量表:存放编译器可知的各种基本数据类型,引用类型。returnAddress类型;

局部变量表的内存空间在编译器完成分配,当进入一个方法时,这个方法需要帧分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小

4)栈大小问题: 栈满抛StackOverFlowError    栈内存溢出

OutofMerory

本地方法栈:虚拟机栈为虚拟机执行java方法服务;本地方法栈为虚拟机执行native方法服务

java堆:

1)存放对象实例(并非所有对象实例都被存放在堆中)

2)是垃圾收集器管理的主要区域

3)新生代,老年代,Eden空间

方法区:

1)存储虚拟机加载的类信息(包括类的版本,字段,方法,接口等描述信息),常量,静态变量,即时编译器编译之后的代码等数据

2)方法区和永久代(这两者在HotSpot中是等价的)

3)垃圾回收在方法区的行为

4)异常定义:申请失败会抛出OutofMemoryError

运行时常量池(属于方法区中的一块)

对象的创建:

方式:new关键字--》存储到java堆中

遇到问题:

1)给对象分配内存:

指针碰撞法(java堆use和free很规整时使用);

空闲列表法(使用一张表来进行记录哪些内存未使用)

2)线程安全性问题

采用线程同步方式解决;

采用本地线程分配缓冲(TLAB)  来提高一些性能

3)初始化对象

初始化之后:

抽象数据类型默认为null;  基本数据类型默认为0;boolean型默认为false

4)执行构造方法

探究对象结构:

对象的访问定位:(如何找到对象)

1)使用句柄

2)直接指针,速度快,减少性能开销

原文地址:https://www.cnblogs.com/zjf-293916/p/9251590.html

时间: 2024-10-11 02:58:49

深入理解java虚拟机-java内存区域与内存溢出异常的相关文章

深入理解java虚拟机系列(一):java内存区域与内存溢出异常

文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了开始.如果有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂,从上图就可以看出了.堆栈分法中所指的"栈"实际上只是虚拟机栈,或者说是虚拟机栈中的局部变量表部分.接下

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

《深入理解Java虚拟机》笔记02:Java内存区域与内存溢出异常

1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间: 有的区域随着虚拟机进程的启动而存在 有些区域则依赖用户线程的启动和结束而建立和销毁 根据<Java虚拟机规范(Java SE 7版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示. 1.1 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的

深入了解Java虚拟机(1)java内存区域与内存溢出异常

java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局部变量,基本类型变量,引用等信息 3.Java本地方法栈:线程私有,为虚拟机使用到的Native方法服务 4.Java堆:线程共享,是垃圾收集器的主要工作地方:存储对象实例等 5.方法区:线程共享:存储类信息,常量,静态变量等 运行时常量:存放编译时生成的各种字面量和符号引用 6.直接内存:机器的内

【java虚拟机】java内存区域与内存溢出异常

本文参考自<深入理解Java虚拟机>一书.主要总结一下java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题. 1. 运行时数据区域 java虚拟机在执行java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.具体如下图所示: 结合这张图,下面逐个来分析一下每个数据区域的特点. 1.1 程序计数器(Program Counter

Java虚拟机——Java内存区域与内存溢出

内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区.下面详细阐述各数据区所存储的数据类型. (图片来自:http://blog.csdn.net/ns_code/article/details/17565503) 程序计数器(Program Counter Register) 一块较小的内存空间,它是当前线程所执行的字节码的行号

【深入Java虚拟机】之一:Java内存区域与内存溢出

[深入Java虚拟机]之:Java内存区域与内存溢出 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区.下面详细阐述各数据区所存储的数据类型. 程序计数器(Program Counter Register) 一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的

Java虚拟机-java内存区域

运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个大小不同的数据域:这些区域都有各自的用途,以及创建和销毁时间,有的区域会随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁. 程序计数器: 程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的信号指示器: 由于Java虚拟机的多线程是通过线程轮流转换并分配处理执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令.因此,为了线程切换后能恢复到正确的

java虚拟机-(二)-java内存区域与内存溢出异常

1.简述:java虚拟机在执行java程序的过程中,会把他所管理的内存分为以下几个区域, 1.1.程序计数器 1.2.虚拟机栈 1.3.本地方法栈 1.4.java堆 1.5.方法区 如图所示: 2.各个区域的主要功能介绍 2.1.程序计数器:它可以看成是当前线程所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,   分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖计数器来完成,程序计数器是线程私有的内存,各线

【深入Java虚拟机(1)】:Java内存区域与内存溢出

内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区.下面详细阐述各数据区所存储的数据类型.程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支.跳转.循环等基础功能都要依赖它来实现.每