美文网首页大学生活我爱编程
java编程中的堆与栈,你了解多少?

java编程中的堆与栈,你了解多少?

作者: 启示录是真的 | 来源:发表于2018-05-27 21:01 被阅读21次

在JVM中内存有这5类

堆(Heap)

存放关键字new创建的对象和数组;

java堆是jvm内存管理中最大的一块,线程共享;

当使用new创建对象时,不必指定分配空间的大小,jvm会动态自动分配一块区域;在程序执行过程中,没有指向此对象的引用时,此对象就被标记为可被回收状态,将由GC(垃圾回收器)在一个不确定的时间自动回收,释放所占的内存空间。

在jvm启动的时候创建。此区域唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。但是随着JIT编译器(即时编译器)的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙变化(对象可能会分配到栈上),所以这种所有对象都分配在堆上也不是那么绝对的。

虚拟机栈(VM Stack)

存放8种基本类型的数据和对象引用(不是对象)。

每个线程有自己的单独的栈。

先进后出,后进先出。小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

因为主要存放基本类型数据变量,所以分配空间比堆快。当超出变量的作用域,将由编译器立即释放空间。

本地方法栈(Native Method Stack)

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

程序计数器 (Program Counter Register)

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

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

特点:

线程私有:因为 Java 虚拟机的多线程是通过 线程轮流切换 并 分配处理器执行时间 来实现的,在某一时刻,只会执行一条线程。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。

无内存溢出:如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在 执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在 Java 虚拟机程序规范中没有规定任何 OutOfMemoryError 情况的区域。

小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!方法区(Method Area)

跟堆一样,被所有的线程共享。

在装载类文件时,用于存储类型信息(类的描述信息):

是一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息(类的描述信息):

运行时常量池:在方法区中,每个类型都对应一个常量池,存放该类型所用到的所有常量,常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。(存的可能是个普通的字符串,然后经过常量池解析,则变成指向某个类的引用)

字段信息:字段信息存放类中声明的每一个字段的信息,包括字段的名、类型、修饰符。

字段名称指的是类或接口的实例变量或类变量,字段的描述符是一个指示字段的类型的字符串,如private A a=null;则a为字段名,A为描述符,private为修饰符。

方法信息:类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。

(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。)

静态成员变量:类中的静态成员变量和静态代码块。

到类classloader的引用:到该类的类装载器的引用。

到类class的引用:虚拟机为每一个被装载的类型创建一个class实例,用来代表这个被装载的类。

每个类的全限定名

每个类的直接超类的全限定名(可约束类型转换)

该类是类还是接口

该类型的访问修饰符小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

直接超接口的全限定名的有序列表

类的基本信息:

已装载类的详细信息:

栈是运行时的单位,而堆是存储的单位。

总结堆与栈的关系

栈是运行时的单位,而堆是存储的单位。

堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。

小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。

相关文章

  • java编程中的堆与栈,你了解多少?

    在JVM中内存有这5类 堆(Heap) 存放关键字new创建的对象和数组; java堆是jvm内存管理中最大的一块...

  • Android内存管理及内存泄漏分析(一)

    1、堆和栈 要了解Android的内存,必须先从Java的堆和栈看起,我们先看看《Think In Java》中对...

  • java内存区域

    先验知识 java堆、栈栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,J...

  • 2021-01-19 线程运行原理

    栈与栈帧 Java Virtual Machine Stacks (Java 虚拟机栈)我们都知道 JVM 中由堆...

  • java堆、栈、堆栈的区别

    1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • Java中的堆和栈

    堆和栈都是Java在Ram中存放数据的地方,Java自动管理堆和栈,开发者不能直接地设置堆或栈。 Java的堆是一...

  • Java中的栈与堆

    基本数据类型是在 栈中创建,引用数据类型在堆中创建,栈中的数据类型有系统自动销毁,而堆中的引用数据类型系统有时候不...

  • java中的堆与栈

    关键词:堆与栈的定义,生存周期 定义 在运行java程序时,java把内存划分成两种:一种是栈内存,一种是堆内存。...

  • Java中的堆与栈

    栈可以理解为内存中一片连续的区域,而堆可以理解为内存中一片分散的区域。可以说,栈是用来运行程序的区域,当在栈里应用...

网友评论

    本文标题:java编程中的堆与栈,你了解多少?

    本文链接:https://www.haomeiwen.com/subject/benbjftx.html