首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解栈、堆、全局、文字常量程序代码

(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。...注意它与数据结构中的堆是两回事,分配方式倒是类似于链表 全局(静态)(static): 全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。...文字常量:常量字符串就是放在这里的。程序结束后由系统释放 程序代码:存放函数体的二进制代码。.../栈 char s[] = "abc";//栈 char *p2 = "123456";//"123456"在常量,p2在栈上 static int c = 0;//全局静态...strcpy(p1, "123456");//123456在常量,编译器可能将它与p1所指向123456优化为一个地方 } 堆和栈的理论知识 申请方式 栈由系统自动分配,速度较快,是一块连续的内存区域

23610

java常量池在方法还是堆_JAVA常量

运行时常量池(runtime constant pool) 当程序运行到某个类时,class文件中的信息就会被解析到内存的方法区里的运行时常量池中。...元空间并不是方法!!! 方法包括类信息、常量、静态变量等,是JVM规范。 方法是jvm规范里面的概念。 1.7之前方法的实现就是永久代。...1.7 把常量池和静态变量放入了堆中,也就是方法由永久代和堆实现。 1.8 把永久代删除使用元空间,也就是方法由元空间(类信息)和堆实现(常量池、静态变量)。...这句话,可不就是说,所有的运行时常量池都是从jvm的 method area 方法区分配来的。 所以,说常量池在方法,是对的。因为方法是个概念的东西。...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164776.html原文链接:https://javaforall.cn

2.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Jvm与字节码——方法常量池 原

分区规范 首先要明确,JVM规范中并没有常量池这一说法,都是各种不同的jvm实现为了便于处理加以区分的。在JVM规范中统一称呼为方法(JDK7之后这样说也不准确,有些数据常量数据又迁移到堆中)。...(但实际处理还是有很多差异,大部分以前放置在永生代数据被迁移到堆中,而元数据仅存放引用。...在jvm启动时,这些信息会被加载到class常量池中,当一个类要被编译加载之前这些符号和字符串会经过JVM的加载器将其实例化成为一个常量值(Class对象的实例)存在在运行时常量。...运行时常量池 运行时常量池(Runtime Constant Pool)主要用于存放jvm在运行时所有静态量。参考"深入理解java虚拟机"一书2.2.6对其的描述:运行时常量池是方法的一部分。...)就会生成一个常量并放置在常量池中,随后所有使用到这个字符串的位置,都是直接从常量池引用。

1.4K30

常量池和堆的区别_字符串常量池在堆中还是方法

如下 2.运行时常量池 2.1运行时常量池的简介 运行时常量池是方法的一部分。...博主一定会在第一时间参与讨论 4.1常量池和字符串常量池的版本变化 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法, 此时hotspot虚拟机对方法的实现为永久代 在JDK1.7...字符串常量池被从方法拿到了堆中, 这里没有提到运行时常量池,也就是说 字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法, 也就是hotspot中的永久代 在JDK1.8 hotspot移除了永久代用元空间...(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法, 只不过方法的实现从永久代变成了元空间(Metaspace) 4.2String.intern在JDK6和JDK7...那是因为堆中的123对象不是同一个对象,但是第二个str1.intern和s2.intern指的都是字符串常量池里的123对象所以是true 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

1.1K30

运行时常量池与字符串常量池_字符串常量池在堆中还是方法

Pool( 运行时常量池 ) 4、总结 二、方法的class文件信息,class常量池和运行时常量池的三者关系 2.1、三者关系图: 2.2、方法class文件信息 2.3、class常量池: 2.4...上面程序, 首先,经过编译之后,在该类的 class常量池 中存放一些符号引用; 然后类加载之后,将 class常量池 中存放的符号引用转存到 运行时常量池 中; 然后经过验证,准备阶段之后...二、方法的class文件信息,class常量池和运行时常量池的三者关系 面试题: 方法区里的 class文件信息 和 class文件常量池 是个什么关系。...2.1、三者关系图: 2.2、方法class文件信息 可以看到在方法区里的class文件信息包括:魔数,版本号,常量池,类,父类和接口数组,字段,方法等信息,其实类里面又包括字段和方法的信息。...这就解答了class文件和class文件常量池的关系 class文件常量池和运行时常量池的关系以及区别 class文件常量池存储的是当class文件被java虚拟机加载进来后存放在方法的一些字面量和符号引用

63020

VBA程序的变量和常量

大家好,在本节就主要介绍变量和常量,主要掌握声明变量和变量赋值,变量的作用域和存活期需要理解。...一、变量和常量的命名 首先介绍下变量和常量命名,在VBA中可以使用名称来表示内存的位置,这个名称就是标识符,可以理解为变量和常量的名字。...1、变量的概念 变量是用于保存程序运行过程中的临时值,和常量不同的是,在程序运行过程中变量保存的值是可以被改变的。 2、声明变量 在使用变量时,需要告诉VBA程序变量的名称和数据类型,即声明变量。...只有当程序退出时候静态变量才会重置。 其实模块级变量和工程级变量的结果和静态变量时一样的,只有当程序退出时占用的内存才会释放。...三、常 量 最后简单说一下常量,在程序运行过程中值不会发生变化,常量可以在程序中直接书写的量。

1.4K20

Linux】理解缓冲

此时刷新的过程就是把数据从内存刷新到外设,刷新到外设的同时,也会把程序内部的缓冲的数据直接清走,这就是写入,跟写时拷贝有关系 对于这个现象的问题我们可以直接往下看 ---- 二.认识缓冲 1.为什么...缓冲的本质就是一段内存。...我们之前谈论的所有缓冲都指的是用户级语言层面提供的缓冲。...这个缓冲,在stdout,stdin,stderr对应的类型---->FILE*,FILE是一个结构体,里面封装了fd,同时还包括了一个缓冲!...FILE结构体缓冲,所以我们直接要强制刷新的时候fflush(文件指针),关闭文件fclose(文件指针),这是因为传进去的文件指针对应的缓冲 从源码出发,我们可以来看一看FILE结构体: 所以我们一般所说的缓冲是语言级别的缓冲

17940

【面试题精讲】JVM-方法-字符串常量

什么是字符串常量池? 字符串常量池是 Java 中的一种特殊的内存区域,用于存储字符串常量。它是在编译阶段就确定并存储的,是一种优化机制,可以减少内存的占用和提高程序的执行效率。 2....当程序中使用字面量创建字符串时,比如"hello",Java 会首先在字符串常量池中检查是否存在该字符串,如果存在则返回对应的引用,如果不存在则创建新的字符串对象,并将其加入到字符串常量池中。 4....方便字符串常量的共享:在多个地方使用相同的字符串常量时,可以直接引用字符串常量池中的对象,提高了代码的可读性和维护性。 6....字符串常量池的缺点 容易造成内存泄漏:如果有大量重复的字符串被频繁地创建,但在程序执行结束后却没有释放,会导致内存泄漏问题。...总结 字符串常量池是 Java 中用于存储字符串常量的一种优化机制。它通过引用相同的字符串对象,节约了内存空间,并提高了程序的执行效率。但需要注意内存泄漏问题以及字符串对象的不可变性。

13130

实战:OutOfMemoryError 异常(三) -- 方法和运行时常量池溢出

关于方法和运行时常量池溢出的情况。 运行时常量池是方法的一部分,所以这两个放到一起进行测试。...在JDK 1.6及之前的版本中,由于常量池分配在永久代内,我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 限制方法大小,从而间接限制其中常量池的容量。...,在 OutOfMemoryError 后面跟随的提示信息 是“PermGen space”,说明运行时常量池属于方法(HotSpot 虚拟机中的永久代)的一部 分。...而当使用 JDK 1.7(或者 JDK 1.8)运行这段程序就不会得到相同的结果,while 循环将一直进行下去。...方法用于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。对于这些区域的测试,基本的思路是运行时产生大量的类去填满方法,直到溢出。

19320

编码篇-iOS程序中的内存分配 栈全局等相关知识

前言 在计算机的系统中,运行的应用程序中的数据都是保存在内存中,不同类型的数据,保存的内存区域不同。内存区域大致可以分为:栈、堆、全局(静态)、文字常量程序代码。...(1)堆(heap) 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如在ios 中 alloc 都是存放在堆中。...全局(静态) (static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。程序结束后有系统释放。...文字常量 存放常量字符串,程序结束后由系统释放 五.程序代码 存放函数的二进制代码 补充说明 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行...#栈 char *p1; #栈 char *p2 = "123456"; #123456在常量,p2在栈上。

1.5K20

【C 语言】内存四原理 ( 常量示例 | 不同函数返回的相同字符串的指针地址相同 )

文章目录 前言 一、正常程序 二、获取相同的字符串内容 前言 C / C++ 编译器会对代码进行 词法分析 , 语法分析 , 句法分析 ; 然后对代码进行优化 ; 将 字符串常量 赋值给指针时 , 首先去...全局变量常量 查询该 字符串常量是否存在 , 如果存在 , 直接使用该 字符串常量地址 赋值给 char* 指针 , 如果不存在 , 直接在常量 创建一个新的字符串 , 然后将地址 赋值给...char* 指针 ; 下面的 2 个程序 , 分别演示 不同的字符串常量 和 相同的字符串常量 地址的区别 ; 一、正常程序 ---- 分别从两个函数中 , 获取两个不同的字符串 , 打印出这两个...4210760 二、获取相同的字符串内容 ---- 如果在 2 个函数中 , 获取的 字符串 是相同的字符串 ; 此时打印出两个函数的指针地址是相同的 , 这是因为 获取的 字符串 都是从 全局...中的 常量 中获取的 ; 代码示例 : #include /* * 函数1 返回字符串 1 */ char *get_str1() { char *p1 = "abc

3.6K10

【面试题精讲】JVM-方法-运行时常量

在编译阶段,Java 类文件中的常量将会被分析和存储到运行时常量池中。运行时常量池可以看作是一张表,在程序运行时通过常量的索引值直接或间接地引用这些常量。...运行时常量池的存在有以下几个重要的原因: 节省内存空间:在程序执行时,运行时常量池中的常量可以被多个不同的对象所共享,避免了重复存储相同的常量数据。...提高执行效率:通过直接或间接引用运行时常量池中的常量,可以快速获得这些常量的值,提高了程序的执行效率。 3....字符串常量池中的每个字符串常量都是唯一的,它们被存储在运行时常量池中,并且可以通过索引值在程序运行时快速引用。...提高执行效率:通过直接或间接引用常量,可以快速获得常量的值,提高了程序的执行效率。 6.

31520

Linux修炼】13.缓冲

缓冲的理解 一. C接口打印两次的现象 二. 理解缓冲问题 为什么要有缓冲 缓冲刷新策略的问题 所说的缓冲在哪里?指的是什么缓冲? 三. 解释打印两次的现象 四. 模拟实现 五....缓冲与OS的关系 一....理解缓冲问题 缓冲本质就是一段内存 那么既然有了本质前提,那么就有这几个方面要思考: 缓冲是谁申请的? 缓冲区属于谁? 为什么要有缓冲?...而这个过程中,顺丰这块开辟的空间就相当于缓冲。 那么缓冲的意义是什么呢?——节省进程进行数据IO的时间。这也就回答了第三个问题为什么要有缓冲。...,就比如我们常用的快捷键:ctrl + s 总结: 因此以上我们所提到的缓冲区有两种:用户缓冲和内核缓冲,用户缓冲就是语言级别的缓冲,对于C语言来说,用户缓冲就在FILE结构体中,其他的语言也类似

1.8K00

OutOfMemoryError异常系列之方法溢出和运行时常量溢出池溢出

按照虚拟机的内存分配,运行时常量池属于方法,所以今天在这一起讲了,大家都知道1.7的虚拟机规范出来以后,有个很重要的一点就是去永久代。...作用就是如果常量池中有这个String变量,则取出,没有的话就是放进去。并返回其String的引用。...),不断的将String.valueOf(i++).intern()放入一个list中(i之所以变化,是为了不放入同一个String,不然他就会不断地取旧值,不会溢出),为了尽快见到结果,我们可以设置常量池容量...从这个运行结果可以看出,运行时常量溢出,后面的这个PerGen space说明运行时常量是方法的一部分。如果大家使用jdk1.7以上版本。...str2);} 这个运行在1.7结果是true false,但是在1.6是false false 至于为什么,大家可以自行理解,今天有点累写不动了,下一篇文章我会给大家详解并说一下方法异常

867100

程序内存四之模型建立

内存四建立 流程说明: 1、操作系统把物理硬盘代码load到内存 2、操作系统把c代码分成四个 3、操作系统找到main函数入口执行 各区元素分 函数调用模型 文字说明:...1、一个主程序有n函数组成,c++编译器会建立有几个堆?...有几个栈? 2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期? 分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?)...\n"); system("pause"); return ; } 程序的静态模型(简化) 堆栈理解: #define _CRT_SECURE_NO_WARNINGS #include...\n", tmp); system("pause"); return 0; } 程序的堆栈模型(简化) 测试stack生长方向 #define _CRT_SECURE_NO_WARNINGS

64820

Linux内核编程--文件流与缓冲

Linux系统下,通过编程对文件进行操作的方式有两种机制:文件描述符和文件流 1.文件描述符和文件流的区别: 文件描述符的类型为int,文件流的类型为FILE*(文件指针)。...Linux内核操作文件会使用高速缓冲。...比如write操作, 进程把数据写到缓冲, 然后内核把数据从缓冲写到磁盘文件。 当进程不断写入数据时,内核可以等缓冲满了再一次性往磁盘写入,这样可以提高性能。...流程图如下: 缓冲分三种模式: (1)全缓冲,写满标准I/O缓冲后才进行I/O操作, 例如磁盘文件(非交互式设备)的I/O操作 (2)行缓冲,在输入/输出中遇到换行符时才进行I/O操作,例如在终端进行...,mode为缓冲类型,size为缓冲区内字节的数量 --mode参数如下: _IOFBF:全缓冲模式 _IOLBF:行缓冲模式 _IONBF:无缓冲模式 若成功则返回0,若出错则为非0 代码样例:

2.7K10
领券