精华内容
下载资源
问答
  • java堆栈方法区详解

    2021-02-12 10:25:46
    在java中,堆栈和方法区的原理是它的底层运行机制之一,如果能了解透对我们编写java代码会有非常大的帮助,本篇文章就跟小编来了解下。栈区在java中,每个线程都会包含一个栈区,且在栈中它只会保存方法的基础数据...

    在java中,堆栈和方法区的原理是它的底层运行机制之一,如果能了解透对我们编写java代码会有非常大的帮助,本篇文章就跟小编来了解下。

    栈区

    在java中,每个线程都会包含一个栈区,且在栈中它只会保存方法的基础数据类型及自定义对象的引用,栈的内存管理不会存在内存回收问题,但堆会,因为堆是随机分配内容的。

    Java中的JVM是基于堆栈的虚拟机,在创建每个新线程时都会分配一个堆栈.就是说,对Java程序而言,它的运行就只是通过一些堆栈操作来完成的。

    每当线程执行一个方法时,它就会跟着创建一个对应栈帧,并把建立的栈帧压栈。方法执行完毕后,再把栈帧出栈。

    由此我们可知,线程与当前所执行的方法对应的栈帧是必定位于Java栈顶部的。因此对于所有的程序设计语言而言,栈这部分空间对开发者来说是不透明的。

    堆区

    在java中,堆数据区是用来存放对象和数组的,每个对象都包含一个与之对应的class的信息,堆内存是被多个线程共享的。在JVM启动后堆内存会随之创建。堆中只会存放对象本身,不会存放基本类型和对象引用,几乎所有的对象实例和数组都在堆中分配。

    方法区

    我们一般也叫静态区,它与堆一样是被所有的线程共享的。方法区用于存储已经被虚拟机加载的常量、静态变量、类信息、即时编译器编译后的代码等数据。

    方法区实际上来说是一个各个线程共享的内存区域,就是用来存储已经被虚拟机加载完成的各种即时编译器编译后的代码等一些数据。

    内存区存放示意图:

    e04dda48a0571d9640a8a937e024f2f8.png

    以上就是本篇文章的所有内容,更多详细java常见问题及解决方法敬请关注奇Q工具网了解详情。

    推荐阅读:

    展开全文
  • 二、栈、堆、方法区存储的内容 堆区: 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象...

    一、JAVA的六种存储地址

    寄存器 register

    位于处理器内部,是最快的储存器,但是数量极其有限。由编译器根据需求进行分配,不能由代码控制,对于开发者来说是 无感知 的。

    堆栈 stack

    位于RAM中,堆栈指针下移分配新的内存,上移释放内存。创建程序的时候,编译器必须知道存储在堆栈中所有数据的确切大小和生命周期。某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。

    堆 heap

    位于RAM中,相比堆栈的优势是不需要知道从堆里分配多少存储空间以及存活时间。JAVA对象存储在这里。

    静态存储 static

    这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的

    常量存储 constant

    常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。

    非RAM存储

    如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

    二、栈、堆、方法区存储的内容

    堆区:

    存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

    jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 。

    栈区:

    每个线程包含一个栈区,栈中只保存基础数据类型的值和对象以及基础数据的引用

    每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

    栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

    方法区:

    又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

    方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

    464c6ac3917f364cb9367ecc853c6e8a.png

    三、JAVA 基本数据类型的存储

    基本类型一共有8种,即int, short, long, byte, float, double, boolean, char。这种类型的定义是通过int a = 3 的形式来定义的,称为自动变量。值得注意的是自动变量存的是字面值,不是类的实例。

    例如 int a = 3,这里的a是一个指向int类型的引用,指向3这个字面值,整个过程种没有类的存在。字面值的数据大小可知,生存期可知(定义在程序块中,程序块退出后,字段值就消失了),存在栈中。

    栈有一个很重要的特殊性,就是存在栈中的数据可以共享

    假设我们同时定义 int a = 3; int b = 3;

    编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

    特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。

    如上例,我们定义完a与 b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

    文章来源: segmentfault.com,作者:李劲夫,版权归原作者所有,如需转载,请联系作者。

    原文链接:segmentfault.com/a/1190000037769009

    展开全文
  • 方法区 1.8之前的永久代,之后的元空间 方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 方法区是JVM规范中的对堆内存管理的规范,而永久代或者元空间是对规范的具体实现,...

    方法区 1.8之前的永久代,之后的元空间

    方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    方法区是JVM规范中的对堆内存管理的规范,而永久代或者元空间是对规范的具体实现,JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,之后1.8种元空间替代方法区。

    元空间本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下元空间的大小仅受本地内存限制。

    在这里插入图片描述

    方法区的垃圾回收

    Java虚拟机规范对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。

    具体存储类型

    1、类型信息:
    1. 类的完整名称
    2. 类的直接父类的完整名称
    3. 类的直接实现接口的有序列表
    4. 类型标志(类类型还是接口类型)
    5. 类的修饰符(public private defautl abstract final static)
    2、类型的常量池

    存放该类型所用到的常量的有序集合,包括直接常量(字符串、整数、浮点数)和对其他类型、字段、方法的符号引用。

    3、字段信息(该类声明的所有字段)
    1. 字段修饰符(public、peotect、private、default)
    2. 字段的类型
    3. 字段名称
    4、方法信息
    1. 方法信息中包含类的所有方法。
    2. 方法修饰符
    3. 方法返回类型
    4. 方法名
    5. 方法参数个数、类型、顺序等
    6. 方法字节码
    7. 操作数栈和该方法在栈帧中的局部变量区大小
    8. 异常表
    5、类变量(静态变量)

    指该类所有对象共享的变量,即使没有任何实例对象时,也可以访问的类变量。它们与类进行绑定。

    6、指向类加载器的引用

    每一个被JVM加载的类型,都保存这个类加载器的引用,类加载器动态链接时会用到。

    7、指向Class实例的引用

    类加载的过程中,虚拟机会创建该类型的Class实例,方法区中必须保存对该对象的引用。通过Class.forName(String className)来查找获得该实例的引用,然后创建该类的对象。

    8、方法表

    为了提高访问效率,JVM可能会对每个装载的非抽象类,都创建一个数组,数组的每个元素是实例可能调用的方法的直接引用,包括父类中继承过来的方法。这个表在抽象类或者接口中是没有的,类似C++虚函数表vtbl。

    9、运行时常量池(Runtime Constant Pool)

    用于存放编译器生成的各种字面常量和符号引用,这部分内容被类加载后进入方法区的运行时常量池中存放(JVM栈中的动态链接就是链接的运行时常量池

    Eclipse中使用javap反编译字节码

    在这里插入图片描述

    展开全文
  • 1、java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方2、堆存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令);jvm只有一个heap,被所有线程共享,不存放...

    1、java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方

    2、堆区

    存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令);

    jvm只有一个heap区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身。

    堆的优劣势:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数

    据,但缺点是,由于要在运行时动态分配内存,存取速度慢。

    3、栈区

    每一个线程包含一个stack区,只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在共享heap中;

    每个栈中的数据(基本数据类型和对象引用)都是私有的,其他栈不能访问;

    栈分为3部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

    栈的优势劣势:存取速度比堆要快,仅次于直接位于CPU的寄存器,但必须确定的是存在stack中的数据大小与生存期必须是确定

    的,缺乏灵活性。单个stack的数据可以共享。

    stack:是一个先进后出的数据结构,通常保存方法中的参数,局部变量。

    在java中,所有基本类型和引用类型都在stack中储存,栈中数据的生存空间一般在当前scopes内

    4、方法区

    1、又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量;

    2、方法区中包含的都是在程序中永远的唯一的元素

    5、在JAVA中,有六个不同的地方可以存储数据:1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所

    以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

    2. 堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;

    若向上移动,则释放那些 内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储

    在堆栈内所有数据的确切大小和生命周期,因为它必须生成 相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活

    性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其 中。

    3. 堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知

    道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要

    创建一个对象的时候,只需要new写一行简单的代码,当执行 这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必

    须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。

    4. 静态存储(static storage)。这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字

    static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。

    5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在

    嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中

    6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。就速度来说,有如下关系:寄存器 < 堆栈 < 堆 < 其他

    运行类过程:方法区找到方法--堆中实例化对象--调用栈(指向堆中实例)

    展开全文
  • 一 JVM运行时数据区有哪些我们先来看一张图JVM运行时数据区分类1.... 方法区 (Method Area)4. 本地方法栈 (Native Method Stacks)5. 程序计数器 (Program Counter (PC) Register)二 详解数据区2.1 JVM栈 (Ja...
  • 一、java的六种存储地址及解释1) 寄存器(register):这是最快的存储,因为它位于不同于其他存储的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能...
  • java8内存结构介绍java虚拟机在jdk8改变了许多,网络上各种解释都有,在...这些区域被称为虚拟机内存,同时,对于虚拟机没有直接管理的物理内存,也有一定的利用,这些被利用却不在虚拟机内存数据的内存,我们称它...
  • JVM里的方法区是线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量,静态代码块、即时编译器(JIT Compiler)编译后的代码数据等。 简单而言,就是存储类结构信息,信息里包含了有常量池信息。还有...
  • 1. 方法区从线程的角度来看运行时数据区:创建对象各数据区域的声明:方法区理解元空间、永久代是方法区具体的落地实现。方法区看作是一块独立于Java堆的内存空间,它主要是用来存储所加载的类信息的《Java虚拟机...
  • 通过上一篇文章,我们大体了解了JVM的整体架构,其分为:元数据(JDK7是方法区)、堆、虚拟机栈、本地方法栈、程序计数器几个部分。 本篇文章,咱们对方法区进行剖析,一探究竟。 1. 方法区的理解 方法区(Method ...
  • 深入理解JVM内存分配和常量池

    千次阅读 2021-01-14 15:02:41
    运行时数据区组成和各个区域的作用我们看到运行时数据区可以分为线程共享和线程不共享两部分,其中堆内存和方法区线程共享,本地方法栈、虚拟机栈、程序计数器线程不共享。接下来我们介绍每一个区域的作用:2.1.程序...
  • 1. 方法区的基本理解 1.1 栈,堆和方法区的关系 方法区可以看作是独立于Java堆的一部分,并且也是和堆一样是整个JVM实例共用一份。 1.2 方法区的基本理解 各个线程共享区域 在JVM启动时被创建,并且物理内存...
  • 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被...
  • 对于JDK 1.8之前的版本,HotSpot虚拟机设计团队选择把GC分代收集扩展至方法区,即用永久代来实现方法区,这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内存,能够省去专门为方法区编写内存管理代码的工作...
  • 1.堆(heap) 在JVM中只有一个堆,在虚拟机开启时创建,所有的线程都共用这一个堆。类的对象会储存在堆内存中,而new对象的引用地址会储存在stack栈中。...方法区(method)又叫静态区,这里主要存储的就...
  • 2.详解数据 2.1 JVM栈(Java Virtual Machine Stacks) 先了解栈帧的概念。栈帧是随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。Java栈也称作虚拟机栈...
  • 根据垃圾回收机制中分代回收的思想,如果在HotSpot虚拟机上开发,可以把方法区称为“永久代”(只是可以这么理解,但实质是不一样的),垃圾回收机制在Java堆中划分一个部分称为永久代,用此区域来实现方法区,这样...
  • Java中void方法详解

    2021-03-22 14:41:45
    详细内容void方法是Java中一个不可实例化的占位符,当方法用void来修饰时表示没有返回值。它有两个作用分别为对函数参数的限定以及对函数返回值的限定学习过Java的人都知道,在Java中void表示空的意思,它是Java中的...
  • 存放位置 类变量随着类的加载存在于方法区中,实例变量随着对象的创建存在于堆内存里 2.生命周期 类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失 静态的使用...
  • JVM详解-native & 方法区

    2021-06-09 10:27:59
    方法区1、Native关键字2、PC寄存器3、方法区 1、Native关键字 native :凡是带了native关键字的,说明Java的作用范围达不到了,会调用底层C语言的库 进入本地方法栈;调用本地方法接口JNI,JNI作用:扩展Java的...
  • 缓冲溢出详解

    2021-02-28 06:58:40
    1 缓冲溢出原理缓冲是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲可以是堆栈(自动变量)、堆(动态内存)和静态数据(全局或静态)。在C/C++语言中,通常使用字符数组和malloc/new之类内存...
  • 创建一个学生类 ►下一篇 70.this关键字详解 构造方法方法的区别: 构造方法要与类名相同,无返回类型,在类初始化的时候调用。 方法最好与类名不同,对象调用,静态方法可用类名.方法(). 构造器和方法在下面三...
  • 上篇博客介绍了springboot的自动配置原理,这一篇我们就研究一下springboot的run方法,到底是如何运行的。 springboot版本:2.1.1.RELEASE 今天我们就以debug的形式,跟着run方法走一遍。 启动mian方法,进入到...
  • account和my 就是你想要的库 风云合办法,放着好久了,现在放出来大伙用,外面有人卖工具 大家看着用吧。帮派数据没合。重要数据都处理了。BY:EV ========================================== ID修改查询旧数据...
  • Java虚拟机内存区详解

    2021-05-07 14:28:02
    Java内存结构详解 Java内存也称为运行时数据,先来看一下Java内存结构图: 1:程序计数器 程序计数器是属于线程私有的,所占空间不大,每个线程一份,用来保存当前线程要执行的下一条指令的地址, 在多线程中,...
  • (2)提供公有的get和set方法,在方法体中进行合理值的判断,使用public关键字修饰; (3)在构造方法中使用set方法进行合理值的判断; 3、事例如下/*Person.java*/ /* 编程实现Person类的封装 */ public class Person{...
  • Multisim基础使用方法详解

    千次阅读 2021-03-03 17:37:29
    《Multisim基础使用方法详解》由会员分享,可在线阅读,更多相关《Multisim基础使用方法详解(19页珍藏版)》请在人人文库网上搜索。1、第2章 Multisim9的基本分析方法主 要 内 容2.1 直流工作点分析(DC Operating ...
  • Office Access 2007的Ribbon功能是菜单和工具栏的主要替代工具,提供了Access 2007 中主要的命令界面。Ribbon功能的主要优势之一是,它将通常需要使用菜单、工具栏、任务窗格和其他 UI 组件才能显示的任务或入口...
  • JVM内存区域划分详解

    2021-01-14 15:02:40
    大多数 JVM 将内存区域划分:Method Area(Non-Heap)(方法区)——线程共享Heap(堆)——线程共享Program Counter Register(程序计数器)——非线程共享VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的)——非线程共享...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,172
精华内容 42,868
关键字:

方法区详解