热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java内存结构与Java内存模型

Java内存结构、内存模型、对象模型这几个概念经常会被混为一谈。理论知识容易忘写下来帮助记忆,方便以后查看。1、Java内存结构Java内存结构其实说的是JVM在运

Java内存结构、内存模型、对象模型这几个概念经常会被混为一谈。理论知识容易忘写下来帮助记忆,方便以后查看。


1、Java内存结构

JVM运行时内存区域
Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Java虚拟机规范来实现的。说的是JVM中划分出的各块内存区域分别用来干什么。如上图分为了5大块:方法区,虚拟机栈(有的叫方法栈也有叫线程栈的)、本地方法栈、堆、程序计数器(也有叫寄存器的)。其中方法区和堆是线程共享的内存区域,而虚拟机栈、本地方法栈和程序计数器是线程私有的,或者说是线程隔离的。


1.1 程序计数器:

它是当前线程执行字节码的指示器,通过改变它的值来选取下一条要执行的Java字节码指令。Java代码中的循环、跳转、异常处理、线程获得时间片后的恢复都需要依赖程序计数器。程序计数器所占内存很小,也是唯一一块不会出现内存溢出异常的内存区域。


1.2 虚拟机栈:

虚拟机栈是线程私有的,每一个线程都会分配一个虚拟机栈,它描述的是Java方法执行的内存模型,每个方法执行时都会同步创建一个栈帧,用于存储方法运行过程中需要的数据,指令,返回地址等信息。


1.3 本地方法栈

本地方法栈和虚拟机栈描述类似,区别只在于虚拟机栈描述的是Java方法,而本地方法栈描述的是Native方法(c++语言)。


1.4 方法区

它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区只是Java虚拟机规范中的一种理论思想,在jdk1.7之前这部分内容被存放于永久代中,在jdk1.8之后用元空间来代替。jdk的做法是理论的实现方式。永久代和元空间都可以通过jvm参数来调整其大小,不同的是元空间使用的是直接内存。


1.5 堆

堆是这几块内存区域中最大的一块,存放的是Java中几乎所有的对象实例。几乎所有对象也就是说不是全部,从jdk1.7之后开启了逃逸分析,感兴趣的可以查一查,它说的是当方法中的一个对象,未被外部引用并且未被方法返回,也就是说这个对象只在这个方法内有用,那么这个对象可以直接在栈上分配内存。


2、Java内存模型(JMM)

JMM
JMM可以理解为Java模拟了cpu的硬件架构所规定的一种规范。由于cpu处理速度非常块比内存的读写速度要快很多,为了不妥协内存的读写速度,cpu引入了高速缓存,cpu要想修改主内存的值必须先将主内存中的数据拷贝到高速缓存中进行读取,然后再回写入主内存。
从上节内容可知,Java堆和方法区域是多个线程共享的数据区域。也就是说,多个线程可以操作保存在堆或者方法区中的同一数据。
JMM和多线程相关,它定义了一个线程对共享变量的写入对另一个线程是可见的。Java的多线程间是通过共享内存进行通信的,在通信过程中就会存在一系列如可见性、原子性、顺序性等问题。而JMM就是围绕多线程通信以及其相关的一系列特性而建立的模型。JMM定义了一系列语法集,这些语法集映射到Java中就是volatilesynchronized等关键字。


推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • 阿里面试题解析:分库分表后的无限扩容瓶颈与解决方案
    本文探讨了在分布式系统中,分库分表后的无限扩容问题及其解决方案。通过分析不同阶段的服务架构演变,提出了单元化作为解决数据库连接数过多的有效方法。 ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 原子操作是指在执行过程中不会被中断的操作。本文将探讨Java是如何通过不同的技术手段实现原子操作的,包括CPU层面的总线加锁和缓存行加锁,以及Java层面的锁机制和CAS操作。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 本文详细介绍了Android系统的四层架构,包括应用程序层、应用框架层、库与Android运行时层以及Linux内核层,并提供了如何关闭Android系统的步骤。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
author-avatar
长春搜房-杨志玲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有