重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

时间:2022-12-11 12:33:43

一、Java虚拟机内存区域如何划分

1、Java虚拟机内存区域的划分

区域名称

作用(用途)

类型

特点

虚拟机规定异常情况

内存分配与回收

其他说明

1 程序计数器 指示当前正在执行的字节码指令地址 线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁。
随用户线程结束而自动回收,内存分配与回收具有确定性。分配内存大小编译期可知。 每个线程都有独立的程序计数器。执行Native方法时为空指针。
2 虚拟机栈(栈内存) Java方法执行的内存模型(方法栈帧入栈、出栈)。每个方法执行的时候都会创建一个栈帧用于存储局部变量表、操作数,动态链接、方法出口等。
为虚拟机执行Java方法服务,用于执行Java方法
线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁
1、*Error:线程请求栈深大于虚拟机所允许的栈深。
2、OutMemoryError:如虚拟机栈可以动态扩展,如果在扩展时无法申请到足够的内存时抛出异常
随用户线程结束而自动回收,内存分配与回收具有确定性。
分配内存大小编译期可知
局部变量表:用于存放编译期可知的类型,包括基本类型,引用类型,returnAddress类型。局部变量表所需内存空间在编译期已完成分配,运行期不改变局部变量表大小。
3 本地方法栈 为虚拟机使用到的Native方法服务即用于执行Native方法 线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁
1、*Error:
2、OutMemoryError:
随用户线程结束而自动回收,内存分配与回收具有确定性。
分配内存大小编译期可知,
 
4 堆(GC堆,堆内存) 用于存放对象实例,几乎所有的对象实例都在这里分配 线程共享 1、内存空间较大;
2、随虚拟机进程启动而创建
3、垃圾收集器主要管理的区域
4、不需要连续的内存空间,只要逻辑上连续即可
1、OutMemoryError:堆中没有内存可用于完成实例分配,并且堆也无法再扩展的时候抛出 动态分配。内存分配大小在运行期可知。垃圾收集器主要针对区域。 1、根据垃圾收集器实现算法(分代收集算法)分为:Eden空间、From Survivor空间、ToSurvivor空间。(新生代,老年代)
2、从内存分配角度:堆可划分为多个线程私有的分配缓存区,目的是为了更好的回收内存和更快的分配内存
5 方法区(非堆) 用于存储虚拟机已经加载的类信息、常量、静态变量、即时编译器编译后的代码等(存放Class的相关信息如类名,访问修饰符,常量池,字段描述,方法描述等) 线程共享 1、堆内存的一个逻辑部分
2、内存回收主要针对常量池的回收和类型的卸载
1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配 动态分配。内存分配大小在运行期可知。垃圾收集器主要针对区域。 运行常量池:用于存放编译期生成的各种字面量和符号引用,在类加载后进入运行时常量池时存放。运行时常量池具备动态性即常量可以在编译期内产生也可以在运行期添加新的常量···

直接内存不是Java内存区域。


2、堆内存空间内:对象实例的创建、内存布局和内存定位

(1)堆内存空间内对象如何创建分配

1)根据new指令的类型常量在常量池内定位到该类型的符号引用、并判断该类是否已加载、解析和初始化

2)如果判断类型信息未加载则进行加载

3)在堆内分配指定大小的堆内存空间

如何分配堆内存空间:a、指针碰撞:即堆内存空间物理上是连续分配的,分配相对规整的,在用过的内存往未用过的内存方向进行分配

b、空闲列表:即堆内存空间不是规整分配的,使用一个空闲列表记录当前未分配的内存空间,分配时在该空闲列表内查询符合指定大小的内存空间进行分配

如何保证内存分配的正确性:线程私有分配缓冲区(TLAB),每个线程独立分配一块小内存区域(本地线程分配缓冲),每个线程只在自己的TLAB内分配实例对象。设置TLAB:-XX:+/-UseTLAB

4)自动初始化:初始化内存空间的默认值

5)设置对象头信息

6)执行init初始化方法按照对象声明位置进行初始化

重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

(2)堆内存空间内对象如何布局

1)对象头

2)实例数据

3)对齐

(3)堆内存空间内对象如何定位

1)句柄

2)直接指针


3、OOM异常调试和参数设置

溢出区域

参数设置

异常抛出条件

其他说明

-Xms
-Xmx
堆内存无法自动扩展,没有足够内存分配实例对象 设置参数-XX:+HeapDumpOnOutMemoryError在出现异常时Dump出现当前内存堆转储快照用于事后分析
虚拟机栈和本地方法 -Xss:设置虚拟机栈大小
-Xoss:设置本地方法大小
1、*Error:线程请求栈深大于虚拟机所允许的栈深。
2、OutMemoryError:如虚拟机栈可以动态扩展,如果在扩展时无法申请到足够的内存时抛出异常
每个线程分配的虚拟机栈容量越大,则可建立的线程数就越少
方法区和运行时常量 -XX:PermSize方法区最小容量
-XX:MaxPermSize:最大方法区容量
1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配  
直接内存 -XX:MaxDirectMemorySize:指定直接内存最大容量,如果不指定默认与堆同等大小容量 1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配 不属于Java内存区域
直接内存=物理内存-各个区域内存总和

重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分的更多相关文章

  1. 《深入理解 Java 虚拟机》学习笔记 -- 内存区域

    <深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...

  2. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象

    一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的 ...

  3. Java虚拟机--Java内存区域的划分和异常

    Java内存区域的划分和异常 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 程序计数器 线程私有.可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通 ...

  4. 深入理解java:1&period;3&period;1 JVM内存区域的划分(运行时数据区)

    学习Java GC机制,可以帮助我们在日常工作中 排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序. 我们将从4个方面学习Java GC机制, 1,内存是如何分配的: 2, ...

  5. Java内存区域的划分和异常

    Java内存区域的划分和异常   运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 打开百度App,看更多美图 程序计数器 线程私有.可看作是当前线程所执行的字节码的行 ...

  6. 深入理解java虚拟机(1)------内存区域与内存溢出

    在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...

  7. 深入理解java虚拟机读书笔记1--java内存区域

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  8. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  9. Java虚拟机(JVM)内存区域

            Java虚拟机内存区域分为五部分:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区.其中程序计数器.Java虚拟机栈.本地方法栈属于线程私有内存区,其生命周期与线程相同,随线程的产 ...

随机推荐

  1. Jquery想说爱你不容易

    JQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由John Resig在2006年1月的BarCamp NYC上发布第一个版本.目前是由 Dave M ...

  2. windows &amp&semi; mac 安装lua

    mac从源码编译安装是最方便的,lua源码不足两万行,编译几秒钟的事. 打开terminal,依次输入以下命令: curl -R -O http://www.lua.org/ftp/lua-5.2.3 ...

  3. Unity3D-terrain brush地形画刷无法出现在Scene中,无法刷地图2

    原因大概是 画刷brush 太小了,地图也太小了,没出出现. 如图,非正常状态: 解决方法: tag: terrain brush not working unity

  4. poj 1430 Binary Stirling Numbers

    Binary Stirling Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1761   Accepted ...

  5. MSSQLSERVER并行度

    Microsoft SQL Server最大并行度(MAXDOP) 配置选项控制并行计划用于执行查询的处理器的数目.此选项确定用于执行工作并行查询计划运算符的计算和线程资源.根据是否 SQL Serv ...

  6. DB2 911错误的解释

    SQL0911N  因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2   ...

  7. &lbrack;Swift&rsqb;LeetCode605&period; 种花问题 &vert; Can Place Flowers

    Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...

  8. Java解决LeetCode72题 Edit Distance

    题目描述 地址 : https://leetcode.com/problems/edit-distance/description/ 思路 使用dp[i][j]用来表示word1的0~i-1.word ...

  9. 数据库日志文件&lpar;databasename&lowbar;log&period;ldf&rpar;太大 如何清除

    在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式.方案一:完全命令模式USE[master] GO ALTER DATABASE DNName SET RECOVERY ...

  10. Inner join case when

    SELECT ( ), wn.ActualWorkflowNumber) + ' ' + wi.SN ) AS SN , wi.RecordID , wi.WorkflowName , wc.Work ...