文档章节

Java内存区域

小王穷遊
 小王穷遊
发布于 2017/09/11 22:52
字数 718
阅读 13
收藏 0
点赞 0
评论 0

java虚拟机在运行时,讲内存划分为若干不同的数据区域,如下图所示:

 

 

 

 

  1. 程序计数器
            当前线程所执行的字节码的信号指示器。
            在虚拟机的概念模型中,字节码解释器,就是通过改变这个计数器的值,来选择下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能。
            为了线程切换后,能恢复到正确的执行位置,每个线程都独立拥有一个程序计数器。
            唯一的一个在Java虚拟机规范中,没有规定任何OutOfMemoryError情况的区域。
     
  2. 虚拟机栈
            Java方法执行的内存模型。
            每个方法执行时,都会创建一个栈帧,用于存储:局部变量表操作数栈动态链接方法出口等信息。
            局部变量表:基本数据类型、对象引用(起始地址、代表对象的句柄、对象的相关位置)、returnAddress。局部变量表所需的空间,在编译阶段就完全确定。
            Java虚拟机在这个区域规定了两种异常:StackOverFlowError、OutOfMemoryError。
     
  3. 本地方法栈
            Native方法执行的内存模型。
            Java虚拟机在这个区域规定了两种异常:StackOverFlowError、OutOfMemoryError。
     

  4.         所有的实例对象以及数组都要在堆上分配。但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。
            线程共享。
            Java堆可以物理上不连续,只要逻辑上连续即可。
            异常:OutOfMemoryError
     
  5. 方法区
            用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。
            线程共享。内存回收目标:常量池的回收、类型的卸载。
            异常:OutOfMemoryError
            运行时常量池:用于存放编译期生成的各种字面量和符号引用。运行期间也可能有新的常量加入,比如String类的intern()方法。
     
  6. 直接内存
            并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
            NIO类,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。可以显著提升性能。避免了在Java堆和Native堆中来回复制数据。
            分配虚拟机内存时,需注意。各个内存区域总和,不能大于物理内存限制。

 

    注:参考《深入理解Java虚拟机》(第2版)

© 著作权归作者所有

共有 人打赏支持
小王穷遊
粉丝 6
博文 53
码字总数 18271
作品 0
成都
程序员

暂无相关文章

Boost库编译应用

版本:Boost 1.66.0 Windows库编译 官网指南:直接执行bootstrap.bat处理文件即可,可以我却遇到一堆的问题。 环境:Windows 10 + Visual Studio 2017 Boost编译出来库命名 boost库生成文件命...

水海云 ⋅ 8分钟前 ⋅ 0

解决Eclipse发布到Tomcat丢失依赖jar包的问题

如果jar文件是以外部依赖的形式导入的。Eclipse将web项目发布到Tomcat时,是不会自动发布这些依赖的。 可以通过Eclipse在项目上右击 - Propertics - Deployment Assembly,添加“Java Build ...

ArlenXu ⋅ 8分钟前 ⋅ 0

iview tree组件层级过多时可左右滚动

使用vue+iview的tree组件,iview官网iview的tree树形控件 问题描述:tree层级过多时左右不可滚动 问题解决:修改overflow属性值 .el-tree-node>.el-tree-node_children { overflow: vi...

YXMBetter ⋅ 10分钟前 ⋅ 0

分布式锁

通过数据库实现 http://www.weizijun.cn/2016/03/17/%E8%81%8A%E4%B8%80%E8%81%8A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E8%AE%BE%E8%AE%A1/ ZK实现:curator-recipes分布式锁的使用......

素雷 ⋅ 18分钟前 ⋅ 0

Sublime Text3 快捷键

选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名...

AndyZhouX ⋅ 25分钟前 ⋅ 0

XamarinAndroid组件教程RecylerView自定义适配器动画

XamarinAndroid组件教程RecylerView自定义适配器动画 如果RecyclerViewAnimators.Adapters命名空间中没有所需要的适配器动画,开发者可以自定义动画。此时,需要让自定义的动画继承Animation...

大学霸 ⋅ 25分钟前 ⋅ 0

eureka 基础(二)

使用Eureka服务器进行身份验证 如果其中一个eureka.client.serviceUrl.defaultZone网址中包含一个凭据(如http://user:password@localhost:8761/eureka)),HTTP基本身份验证将自动添加到您...

明理萝 ⋅ 28分钟前 ⋅ 1

Kubernetes(五) - Service

Kubernetes解决的另外一个痛点就是服务发现,服务发现机制和容器开放访问都是通过Service来实现的,把Deployment和Service关联起来只需要Label标签相同就可以关联起来形成负载均衡,基于kuberne...

喵了_个咪 ⋅ 28分钟前 ⋅ 0

更新队友POM文件后报错

打开报错的地方的pom及其引用方法所在文件的pom,观察其版本号是否一致,不一致进行更改

森火 ⋅ 41分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部