专栏首页javathingsJava 内存模型简述

Java 内存模型简述

Java 内存模型是面试官最喜欢问的问题之一。

Java 内存在逻辑功能上分成 5 个区。方法区,堆区,JVM 栈,方法栈,程序计数器(PC 寄存器)。

其中方法区,堆区是所有线程都共享的。JVM 栈,方法栈,程序计数器(PC 寄存器)是每个线程都有独立的一份。

JVM 栈就是程序运行时候的栈,局部变量之类的都存放与此,函数的调用和结束,对应的就是元素的入栈和出栈。递归调用深度过深的话,就会出现 StackOverflow 的错误。JVM 栈中有很多栈帧,每个栈帧都对应一个被调用的方法,栈帧中有局部变量表,用来存储方法中的局部变量。由于每一个线程都有自己的 JVM 栈,所以运行时是互不干扰的。

本地方法栈和 JVM 栈类似,区别就是 JVM 栈运行的 Java 代码,本地方法栈运行的是 NativeCode。

方法区,存放的是 JVM 加载的类的信息,各种静态变量等信息,是全局共享的。Java8 中已经移除了方法区,增加了一个叫做元空间的本地内存区,不过元空间与方法区是有区别的,元空间使用的是本地内存,而不是 JVM 中划分的。所以,元空间的大小仅和本地内存大小有关,元空间的大小可以通过参数来设置。

Java1.7 之前,字符串常量池存放在方法区,Java1.7 之后移到了堆区。

堆区就是所有的实例对象都放在里面,所有的线程都能访问,垃圾回收也主要在这里发生。根据 Java 虚拟机规范的规定,Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。

程序计数器也称作 PC 寄存去,和汇编程序中的 CPU 寄存器概念是类似的,都是用来指示执行的之类地址。每个线程都有各自的程序计数器,互相独立互不干扰。

Java 内存模型划分就是以上几种。但是细究下去还有其他的更多的知识点,比如原子性,可见性等概念。会在后续的文章中讨论。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java性能权威指南

    本书对Java 7和Java 8中影响性能的因素展开了全面深入的介绍,讲解传统上影响应用性能的JVM特征,包括即时编译器、垃圾收集、语言特征等。内容包括:用G1...

    用户3157710
  • Python源码剖析

    作为主流的动态语言,Python不仅简单易学、移植性好,而且拥有强大丰富的库的支持。此外,Python强大的可扩展性,让开发人员既可以非常容易地利用C/C++编...

    用户3157710
  • JavaScript权威指南(原书第6版)

    本书是程序员学习核心JavaScript语言和由Web浏览器定义的JavaScript API的指南和综合参考手册。

    用户3157710
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) - 周志明

    《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级...

    用户3157710
  • JavaScript设计模式与开发实践(图灵原创)

    本书是根据JavaScript语言的特性专门针对JavaScript语言全面总结的设计模式。全书共分为三个部分,一部分讲解了JavaScript语言面向对象和函...

    用户3157710
  • 转型架构师之路——郑天民

    架构师是一个综合性的角色,需要熟练掌握架构设计方法和开发技术,同时具备良好的组织管理能力。在第2篇《深入剖析架构师角色》中我们分析了架构师的主要职责和所开展的活...

    Java天坑
  • 深入理解Android:WebKit卷(移动开发)

    全书一共11章:第1章介绍了Android源代码阅读与编译环境的搭建;第2章介绍了浏览器的通用工作原理以及WebKit的架构设计;第3章深入解析了WTF的实现原...

    用户3157710
  • Java编程思想-第4版

    本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性...

    用户3157710
  • JavaScript语言精粹(修订版)

    JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从最受误解的编...

    用户3157710
  • 超实用的JavaScript代码段 (代码逆袭)

    《超实用的JavaScript代码段》基于实用、实践、前瞻性、学习的原则,笔者精选了近300段JavaScript代码和400种解决方案,覆盖了几乎所有的脚本处...

    用户3157710

扫码关注云+社区

领取腾讯云代金券