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

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

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

33910

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

方法总共就分了10m,在oom的时候,也就使用了7m多,说明这个常量池,在jdk1.7的时候,确实被安排到了堆Java heap里面了。 上面的说明加起来,使得下面这个理论得到了验证。...JAVA的三种常量池 此外,Java有三种常量池,即字符串常量池(又叫全局字符串池)、class文件常量池、运行时常量池。 1....*字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 按照这个分析的话, 运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。...方法包括类信息、常量静态变量等,是JVM规范。 方法是jvm规范里面的概念。 1.7之前方法的实现就是永久代。 1.7 把常量池和静态变量放入了堆中,也就是方法由永久代和堆实现。...1.8 把永久代删除使用元空间,也就是方法由元空间(类信息)和堆实现(常量池、静态变量)。

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

    iOS基础:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态、堆、栈

    全局变量保存在内存的全局存储中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。...全局变量 1.1 全局变量 函数外面声明 可以跨文件访问 可以在声明时赋上初始值 如果没有赋初始值,系统自动赋值为0 存储位置:既非堆,也非栈,而是专门的【全局(静态)存储static】!...(静态)存储static】!...堆(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。与数据结构中的堆是两码事,分配方式类似于链表。 全局(static):全局变量和静态变量存放在此。...文字常量常量字符串放在此,程序结束后由系统释放。 程序代码:存放函数体的二进制代码。 5.

    3.6K50

    内存四之代码,全局,栈和堆

    C++ 在程序执行时,将内存大致分为代码,全局,栈和堆四个区域。不同的区域存储不同的数据,赋予不同的生命周期,能够更灵活地进行编程。...代码:存放函数体的二进制代码,由操作系统管理创建,代码时共享的,对于频繁被执行的程序,只需要存有一份代码即可; 全局:存放全局变量和静态变量以及常量,在程序结束后由操作系统释放; 栈:由编译其自动分配释放...,存放函数的参数值以及局部变量等; 堆:一般由程序员通过 new 开辟空间,进行分配和释放,若程序员不释放,则程序结束时由操作系统回收 下面通过一个例子对全局,栈,堆的数据声明周期进行说明: /...<< "a 的地址为:\t" << int(&a) << endl; cout << "b 的地址为:\t" << int(&b) << endl; // 创建静态变量,属于全局 static...同理,a,b 都属于栈,d_a,d_b 都属于堆

    2.2K00

    静态变量存储在哪个

    美团2017校园招聘 Android 静态变量存储在__ A 全局 B 堆 C 栈 D 常量 2017年3月21日19:00开始笔试,选项凭回忆打的,未全匹配。...本人参考答案:A 知识点 内存到底分几个? 1、栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。...2、堆(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。...3、全局静态)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。...4、文字常量常量字符串就是放在这里的。 程序结束后由系统释放。 5、程序代码—存放函数体的二进制代码。

    1.1K40

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

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

    1.4K30

    方法(Method Area)存储的静态变量

    1:方法(Method Area)存储的静态变量 静态变量又称为类变量,类中被static修饰的成员变量都是静态变量(类变量) 静态变量之所以又称为类变量,是因为静态变量和类关联在一起,随着类的加载而存在于方法...(而不是堆中) 八种基本数据类型(byte、short、int、long、float、double、char、boolean)的静态变量会在方法开辟空间,并将对应的值存储在方法方法,对于引用类型的静态变量如果未用...new关键字为引用类型的静态变量分配对象(如:static Object obj;)那么对象的引用obj会存储在方法中,并为其指定默认值null;若,对于引用类型的静态变量如果用new关键字为引用类型的静态变量分配对象...(如:static Person person = new Person();),那么对象的引用person 会存储在方法中,并且该对象在堆中的地址也会存储在方法中(注意此时静态变量只存储了对象的堆地址...)时执行,静态代码块(静态初始化块)只执行一次 为啥需要静态初始化块?

    34610

    Go:缓冲管理,静态与动态的选择

    本文将解析和讨论Go语言缓冲的动态和静态管理方式。这类技术在高性能计算和资源优化方面特别有价值。 1....技术讨论:静态与动态缓冲 此代码段展示了静态和动态内存管理的结合使用: 静态分配:通过声明一个固定大小的数组buf,在编译时分配内存。...优点分析 静态和动态内存管理各有优缺点,合理的结合使用可以提升程序的性能和效率: 性能:静态分配减少了运行时的内存分配调用,从而降低了延迟。 安全性:预分配的静态数组避免了运行时内存不足的风险。...在这些场景下,数据包的大小可能不断变化,使用静态加动态的内存管理策略可以优化性能和资源利用率。 5....通过结合使用静态和动态方法,开发者可以在保证性能的同时,应对各种运行时的内存需求变化。

    12210

    Java常量池(静态常量池与运行时常量池)

    今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!! 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变!...final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。...1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法中,我们常说的常量池,就是指方法中的运行时常量池。...3、方法中的运行时常量池 运行时常量池是方法的一部分。

    2.3K21

    JVM运行时数据-方法

    JVM运行时数据-方法 方法Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、域信息、方法信息、常量静态变量、即时编译器编译后的代码等数据。...虽然Java虚拟机规范把方法描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。...从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法中的静态变量、字符串常量池等移到堆内存中。...方法的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutofMemoryError:PermGen space 或者java.lang.OutOfMemoryError...方法的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型。 当俩个线程需要加载一个类型时,只会有一个请求classloader,另一个等待。

    35910

    Git 工作、暂存与版本库

    基本概念 工作 在电脑中能看到的目录 工作.jpg 此处的 initialize 文件夹可被看作为工作 暂存 一般存放在 .git 目录下的 index 文件中,也将暂存称作索引 未提交的文件修改通通放在暂存中...暂存.jpg 版本库 工作中的 .git 目录(.git 为隐藏目录) 版本库.jpg 添加文件到版本库中 把文件添加到暂存中 把暂存的所有内容提交到当前分支 添加暂存 将工作中的文件添加到暂存...语法 git add 文件名 添加暂存.jpg 添加完成之后查看本地库状态 添加完成查看.jpg 删除暂存中的文件 只是将文件从暂存中删除,工作中的文件不受影响 语法 git rm --cached...文件名 删除暂存中的文件.jpg 提交本地库 将暂存中的文件提交到本地库 语法 git commit -m “日志信息” 文件名 提交本地库.jpg 查看日志信息 语法 git reflog 查看引用日志信息...提交暂存.jpg 查看状态 查看状态2.jpg 提交本地库 提交本地库2.jpg 查看版本信息 查看版本信息.jpg 历史版本 查看版本信息 语法 git reflog // 查看精简版本信息 git

    72460

    java8静态变量放在哪个_jdk8.0 内存划分

    java1.8之前内存区域分为方法、堆内存、虚拟机栈、本地方法栈、程序计数器。...下图所示: 方法(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量静态变量、即时编译器编译后的代码等数据。...虽然Java虚拟机规范把方法描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。...很多人都更愿意把方法称为“永久代”(Permanent Generation)。...从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法中的静态变量、字符串常量池等移到堆内存中。

    49610

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

    Java文件被编译成 Class文件,Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是常量池,常量池是当Class文件被Java虚拟机加载进来后存放在方法 各种字面量 (Literal...如下 2.运行时常量池 2.1运行时常量池的简介 运行时常量池是方法的一部分。...博主一定会在第一时间参与讨论 4.1常量池和字符串常量池的版本变化 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法, 此时hotspot虚拟机对方法的实现为永久代 在JDK1.7...字符串常量池被从方法拿到了堆中, 这里没有提到运行时常量池,也就是说 字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法, 也就是hotspot中的永久代 在JDK1.8 hotspot移除了永久代用元空间...(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法, 只不过方法的实现从永久代变成了元空间(Metaspace) 4.2String.intern在JDK6和JDK7

    1.1K30

    Java NIO字节缓存【源码笔记】

    目录 一、复制缓冲 1.复制一个缓冲 2.只读缓冲 3.分割缓冲 二、字节缓冲 1.字节顺序 2.直接缓冲...小结:构建只读缓冲实例对象为HeapCharBufferR,只读缓冲拥有独立的mark、position、limit。...4.视图缓冲 I/O本质上是字节的传递,ByteBuffer提供方便的API创建视图缓冲。 1. 通过工厂方法创建视图缓冲,有自己独立的属性、容量、位置、上界和标记。...例如:上文中复制缓冲和分割缓冲。 2.通过ByteBuffer提供API映射为基本类型缓冲。...三、总结 本文从源码角度跟踪分析了复制缓冲、只读缓冲、分割缓冲、字节顺序、非直接缓冲、直接缓冲、视图缓冲的实现原理。 四、参考资料 《Java NIO》第二章(完)

    69111

    Java NIO 缓冲学习笔记

    在NIO库中,所有数据都是用缓冲处理的。在读取数据时,它是直接读到缓冲中的。在写入数据时,它是写入到缓冲中的。任何时候访问NIO中的数据,您都是将它放到缓冲中。 缓冲实质上是一个数组。...但是一个缓冲不仅仅是一个数组。缓冲提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。 最常用的缓冲类型是ByteBuffer。...事实上,对于每一种基本Java类型都有一种缓冲类型(只有boolean类型没有其对应的缓冲类): ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer...在这种情况下,您必须将这些数据直接放入缓冲,然后用通道将缓冲写入磁盘。 或者,您可能想要从磁盘读取用户数据。在这种情况下,您要将数据从通道读到缓冲中,然后检查缓冲中的数据。...这里就会抛出java.nio.BufferUnderflowException异常,因为数组希望缓存的数据能将其填满,如果填不满,就会抛出异常,所以代码应该改成下面这样: ?

    50220
    领券