堆栈

Java中堆内存和栈内存详解

ぐ巨炮叔叔 提交于 2020-03-08 12:58:49
  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。   在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。   堆内存用于存放由new创建的对象和数组。 在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。    引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放 。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放, 数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉 。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! java中内存分配策略及堆和栈的比较    1

linux系统进程的内存布局

别来无恙 提交于 2020-03-07 14:13:29
内存管理模块是操作系统的心脏;它对应用程序和系统管理非常重要。今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕。由于不少概念是通用的,所以文中大部分例子取自32 位x86 平台的Linux 和Windows 系统。本系列第一篇文章讲述应用程序的内存布局。 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space ),在32 位模式下它总是一个4GB 的内存地址块。这些虚拟地址通过页表(page table )映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使能,那么它就会作用于这台机器上运行的所有软件,包括内核本身。因此一部分虚拟地址必须保留给内核使用: 这并不意味着内核使用了那么多的物理内存,仅表示它可支配这么大的地址空间,可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的特权级(ring 2 或以下),因此只要用户态的程序试图访问这些页,就会导致一个页错误(page fault )。在Linux 中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址的,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化:

如何终止线程的运行(C/C++)

点点圈 提交于 2020-03-07 01:31:21
如何终止线程的运行(C/C++) 想要终止线程的运行,可以使用以下方法: 1、线程函数返回(最好使用该方法)。 2、通过调用ExitThread函数,线程将自行撤消(最好不使用该方法)。 3、同一个进程或另一个进程中的线程调用TerminateThread函数(应避免使用该方法)。 4、ExitProcess和TerminateProcess函数也可以用来终止线程的运行(应避免使用该方法)。 下面将详细介绍终止线程运行的方法:1-4,并说明线程终止运行时会出现何种情况:5。 1、线程函数返回 始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。 如果线程能够返回,就可以确保下列事项的实现: (1)在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。 (2)操作系统将正确地释放线程堆栈使用的内存。 (3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。 (4)系统将递减线程内核对象的使用计数。 2、ExitThread函数 可以让线程调用ExitThread函数,以便强制线程终止运行: 函数原型: VOID ExitThread(DWORD dwExitCode); 该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消

单片机内部结构(干货)

假装没事ソ 提交于 2020-03-06 03:07:19
程序计数器PC(Program Counter): 存放着下一条将要从程序存储器中取出的指令的地址。 工作方式: ① 程序计数器PC自动加1。 ②程序计数器将被置入新的数值。 ③ 在执行子程序或响应中断时:将PC的当前值(可称为断点值)自动送入堆栈;将子程序的入口地址或中断向量地址送入PC,程序流向发生变化,执行子程序或中断服务程序。 51单片机存储器采用 哈佛(Harvard)结构 , 即将程序存储器和数据存储器截然分开,程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制系统。 51单片机的4个物理存储空间相当于3个逻辑存储空间。 程序存储器ROM: (内外统一编址) 用来存放暂时性的数据、运算的中间结果或用作堆栈。 随时进行数据的写入和读出,关闭电源时,其所存储的信息将丢失。 特殊存储器单元: 0000H:复位后程序自动运行的首地址 0003H:外部中断0入口地址 000BH:定时器0溢出中断入口地址 0013H:外部中断1入口地址 001BH:定时器1溢出中断入口地址 0023H:串行口中断入口地址 程序一般应安排在0030H地址以后 数据存储器RAM: 用来存放MCU的固定系统程序、应用程序、数据或表格。如系统监控程序等。 写入信息后不易改写的存储器。断电后,其中的信息保留不变。 ①工作寄存器区(含寄存器组0 ~ 3): 寄存器组0:地址00H~07H 寄存器组1

堆栈、BSS段、代码段、数据段、RO、RW、ZI等概念区分

浪子不回头ぞ 提交于 2020-03-05 13:08:03
堆栈、BSS段、代码段、数据段、RO、RW、ZI等概念区分 一 预备知识 二 程序文件中的分区 三 程序进程中的分区 四 总结 一 预备知识 在区分一个程序的堆栈、bss、text段、RO、RW、ZI等概念时,首先区分一下程序进程和程序文件,然后了解一下哈弗结构和冯诺依曼结构。 程序进程就是程序运行时的程序,程序文件是编译后生成的可执行文件,比如.bin文件等,这两个概念很好区分,特别强调一下,分开表达主要是怕读者在阅读过程中混淆了。 哈佛结构和冯诺依曼结构的主要区别就是 处理器能不能实现取指令和取数据的并发进行 。嵌入式芯片中主要是哈佛结构,PC机上是冯诺依曼结构。 经典的哈佛结构: 程序存储器和数据存储器是各自独立的存储器。处理器应该有两套总线,一套是程序存储器的数据和地址总线,一套是数据存储器的数据和地址总线。取指令和取数据能并发进行。51的程序进程的逻辑代码段放在ROM中,而变量部分则放在RAM中,取ROM中的指令和RAM中的变量是两套总线。 改进型哈佛结构: 程序存储器和数据存储器是各自独立的存储器。处理器只有一套总线,分时访问程序存储器和数据存储器,但是在处理器中有icache和dcache将程序和数据分开,所以处理器仍然可以并步执行取指令和取数据。从ARM9开始以后所有的ARM处理器内核都是改进型的哈佛结构。ARM的逻辑代码和变量都是存放在RAM中的,但是

使用backtrace打印程序crash堆栈

半世苍凉 提交于 2020-03-05 06:59:10
使用backtrace打印程序crash堆栈 文章目录 使用backtrace打印程序crash堆栈 利用backtrace可以在程序crash退出之前,打印出crash时的堆栈信息,有助于我们分析crash问题。下面,教大家如何在linux下利用backtrace打印crash堆栈信息。 1. 引入头文件 # include <signal.h> 2. 初始化backtrace struct sigaction newAct ; newAct . sa_handler = NaviBackTrace ; sigemptyset ( & newAct . sa_mask ) ; sigaction ( SIGABRT , & newAct , NULL ) ; sigaction ( SIGSEGV , & newAct , NULL ) ; sigaction ( SIGBUS , & newAct , NULL ) ; sigaction ( SIGFPE , & newAct , NULL ) ; sigaction ( SIGILL , & newAct , NULL ) ; sigaction ( SIGTRAP , & newAct , NULL ) ; 其中 NaviVackTrace 为程序发生crash,退出之前的回调函数,在此函数中可以做一些事情

voliatle关键字

白昼怎懂夜的黑 提交于 2020-03-03 13:59:26
1.volatile关键字使用:   多线程中存在私有堆栈中的值和公共堆栈中的值不同步的问题。什么意思呢?可能线程在一个地方修改了内存中变量的值,而其它地方线程却从私有堆栈中去读取不一致的变量值。关键字volatile 的主要作用是使在多个线程上可见。也就是,强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。 线程的私有堆栈: 读取公共内存: 强制从私有堆栈中取值的方法为JVM被设置为-server(不设置-server也是从私有堆栈中获取值)。 package chapter2; public class VolatileTest { static class RunThread extends Thread{ private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void run() { super.run(); System.out.println("进入run 了"); while (isRunning) { } System.out.println("线程被停止了!

JVM参数详解

半腔热情 提交于 2020-03-03 10:38:38
内存参数 参数 含义 默认值 示例 说明 -Xms 初始堆大小 物理内存的1/64(<1GB) -Xms1g 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. -Xmx 最大堆大小 物理内存的1/4(<1GB) -Xmx1g 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn 年轻代大小 -Xmn512m 注意 :此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 -XX:NewRatio 年轻代与年老代的比值 -XX:NewRatio=1 -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 -XX:SurvivorRatio Eden区与Survivor区的大小比值 默认8:1:1 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10 -Xss 每个线程的堆栈大小

高手之路-- 明白计算机底层! 为了更好地精通C++ ,否则你指针永远也用不好!!必须知道的概念!

老子叫甜甜 提交于 2020-03-03 08:31:13
首先看一下这堆代码, 我先证明 release 跟Debug 编译出来的 反汇编是一样的, 否则那无法进一步 推测了! 以上呢 通过 2种编译 ,结果 居然 release 更慢, 这说明 这代码已经无法 优化了. 以下,让你学习如何看懂 内存, 跟 EBP ,指针对应的 写入堆栈 跟 写入 内存是一样的概念, 只是 相对于 EBP 栈底 地址而言。 你看以下 是 第二次运行的内存 , 你会发现 不可读, 为啥不可读呢,就是因为程序每次运行 基地址都是动态分配的。 那么 以为着, EBP 地址 也是 根据 基址 + 偏移 得到的。 进程需要 通过调用 winAPI的方式 来 实现 向 操作系统申请 更多 内存地址 空间。 你才能 写入更多的内存地址。 这次运行 EBP 地址 变成了 4EEF40 ,然后我们定位到 4EEF40 地址 就能看到 CPU是怎么直接写入 内存地址的. 直接输入 0x 004EEF40 就能定位了, 然后滚轮,往上滚一点点, 你就能看到 ,各种 变量,都会在堆栈底部 网上的位置 存放的。 滚上去,一看 发现很多 0x000000 的 就是 初始化 堆栈的痕迹 ! 瞬间就明白这就是 堆栈的内部! 然后 这里 inc dword ptr [ebp-60h] 就是 ebp-60h 这个地址 ,的数据 自增 1 那么ebp对应的地址是什么呢? 然后 按调试,

I'm a Mac:雄狮训练手册

懵懂的女人 提交于 2020-03-03 02:01:13
《I'm a Mac:雄狮训练手册》 基本信息 作者: Tony 郭涛 [作译者介绍] 出版社:人民邮电出版社 ISBN:9787115286949 上架时间:2012-7-16 出版日期:2012 年8月 开本:16开 页码:768 版次:1-1 所属分类: 计算机 > 软件与程序设计 > 移动开发 > iPhone 更多关于 》》》《 I'm a Mac:雄狮训练手册 》 内容简介 书籍 计算机书籍   这一次,我们告别雪豹,迎来了更强大的lion。   《i'm a mac:雄狮训练手册》内容详尽,逻辑清晰,从整体入手,层层分解,逐级放大,从开机、桌面、菜单栏、dock、finder、多媒体、网络、实用工具……对mac做了全面的解剖处理,一直解剖到mac的“神经”系统,深入浅出。   《i'm a mac:雄狮训练手册》不仅有操作性的介绍,更有原理性的介绍,通过它你可以对mac有一个全新的认识,读完本书,你就完全可以驾驭你的雄狮,甚至对以后的雄狮后代也有所了解,因为它们都是猫科动物,有共同习性。    mac历来注重简单,但是如何把这种简单的威力爆发出来并不简单,这本书就是告诉你简单的威力,简单也可以很强大。用苹果的话说就是,mac之简单,unix之威力。   无论你是一个mac新用户,还是一个mac老用户,都能从中得到惊喜,因为这是一部mac的体验之旅,这就是mac