谈谈Java中的堆与栈

综合编程 2018-05-16 阅读原文

  • 存放8种基本类型的数据和对象引用(不是对象)。
  • 每个线程有自己的单独的栈。
  • 先进后出,后进先出。
  • 因为主要存放基本类型数据变量,所以分配空间比堆快。当超出变量的作用域,将由编译器立即释放空间。

本地方法栈 Native Method Stack

程序调用本地方法的内存区域。

程序计数器 Program Counter Register

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

通过改变计数器的值来选取下一条需要执行的字节码指令。(分支、循环、跳转、异常处理、线程恢复等)基础功能都依赖与其完成。

特点:

  • 线程私有:因为 Java 虚拟机的多线程是通过 线程轮流切换 并 分配处理器执行时间 来实现的,在某一时刻,只会执行一条线程。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。
  • 无内存溢出:如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在 执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在 Java 虚拟机程序规范中没有规定任何 OutOfMemoryError 情况的区域。
稀土掘金

责编内容by:稀土掘金阅读原文】。感谢您的支持!

您可能感兴趣的

Kevin Webber:Java的云迁移 Kevin Webber在开始演讲的时候说,企业软件构建应用程序的形式比较散碎,不够系统,集成很复杂。传统的基础架构(Traditional infrastructures)具备主动/被动的粗糙故障转移(crude failover),支持...
Which Is the Right Java Abstraction for JSON Which Is the Right Java Abstraction for JSON DZone's Guide to Which Is the Right Java Abstraction for J...
探索 JUC 之美—Future 与 FutureTask Future Future 表示一个任务的生命周期,是一个可取消的异步运算。提供了相应的方法来判断任务状态(完成或取消),以及获取任务的结果和取消任务等。 适合具有可取消性和执行时间较长的异步任务。 在并发包中许多异步任务类都继...
Java 线程池的正确打开方式 JAVA 线程池的正确打开方式 摘要:本文属于原创,欢迎转载,转载请保留出处: https://github.com/jasonGeng88/blog 当前环境 jdk == 1.8 Executors 使...
深入理解Java重载与重写 我们都知道Java有三大宝,分别是: 多态、封装、继承 。其中多态主要体现就是重写与重载(有些人认为重载根本不属于多态)两种方式,那么今天就结合研读过JVM之后自己的理解来聊聊重载与重写的VM内部是怎么实现的,是怎么找到最后执行的方法的。...