堆内存

Linux堆的一些基础知识

吃可爱长大的小学妹 提交于 2019-12-06 00:49:07
目录 堆的概述 什么是堆 堆的基本操作 堆操作背后的系统调用 堆的相关数据结构 微观结构 malloc_chuck chunk相关宏 bin 宏观结构 arena heap_info malloc_state 深入了解堆实现 堆初始化 malloc_consolidate() 创建堆 unlink 申请内存块 _libc_malloc _int_malloc 释放内存块 _libc_free 内容来源 堆的概述 什么是堆 堆用来在程序运行时动态的分配内存,对其实就是虚拟空间里从地址向高地址增长的连续的线性区域。 堆的基本操作 void *malloc(unsigned int size):作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。 void free(void *ptr):释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。 堆操作背后的系统调用 brk():将数据段(.data)的最高地址指针_edata往高地址推。(从堆头开始,参数为地址) mmap():在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。(分配大于128k) sbrk():将地址指针往高地址推。(从当前指针位置开始,参数为指针增量)

Ehcache(02)——ehcache.xml简介

半城伤御伤魂 提交于 2019-12-05 22:52:40
转发地址: https://www.iteye.com/blog/elim-2113728 ehcache.xml 简介 ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信息参数创建CacheManager时,CacheManager将首先在类路径的根目录下寻找一个叫ehcache.xml的文件作为CacheManager的配置文件。如果不存在这样的文件则将使用封装在ehcache jar包中的ehcahce-failsafe.xml文件作为创建CacheManager的默认配置信息。除了使用Configuration作为参数外,使用其它参数构造CacheManager都是基于xml格式的配置信息的。当我们使用xml配置文件作为CacheManager的配置信息时,我们的文件名不一定叫ehcache.xml,这里只是把ehcache.xml文件作为这一类文件的一个代表,它们拥有共同的文档结构。本文将对ehcache.xml做一个简要的介绍,主要介绍常用的配置项。 1 ehcache元素 首先我们的ehcache.xml文件必须遵守Ehcache的Xml

Ehcache(04)——设置缓存的大小

眉间皱痕 提交于 2019-12-05 22:52:14
转发地址: https://www.iteye.com/blog/elim-2116749 设置缓存的大小 目录 1 CacheManager级别 2 Cache级别 3 大小衡量 4 配置大小示例 缓存大小的限制可以设置在CacheManager上,也可以设置在单个的Cache上。我们可以设置缓存使用内存的大小,也可以设置缓存使用磁盘的大小,但是使用堆内存的大小是必须设置的,其它可设可不设,默认不设就是无限制。在设置缓存大小的时候,我们可以设置缓存使用某一个存储器的最大字节数,也可以设置缓存在某一个存储器上最多存放元素的数量。 1 CacheManager级别 CacheManager级别有三个属性可以分别用来限制三种存储器缓存信息的大小,其控制的都是字节数,分别是maxBytesLocalHeap、maxBytesLocalOffHeap和maxBytesLocalDisk。CacheManager级别限制的大小是其内所有的Cache共享的。 maxBytesLocalHeap 是用来限制缓存所能使用的堆内存的最大字节数的,其单位可以是K、M或G,不区分大小写。默认是0,表示不限制。但是当我们没有指定CacheManager级别的maxBytesLocalHeap时,我们必须在每一个Cache上指定maxBytesLocalHeap或maxEntriesLocalHeap。

今天是JVM的生日,来了解下JVM的发展历史吧

血红的双手。 提交于 2019-12-05 19:43:43
1991年4月,由James Gosling主导的团队创造了Oak语言,java的前身,1995年5月23号,Oak语言更名Java,并且提出那句注明的:”write Once,Run Anywhere”的口号.1996年1月23日,JDK1.0发布. 当时正好赶上浏览器快速崛起,发展的浪潮,大家发现java一处编译到处使用的特性和浏览器很契合,同一个页面不可能每一个操作系统我都写一遍.用现在的话说java正好站在这个风口上.导致它飞速发展才有了今天的江湖地位. 一、JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后

修改java虚拟机启动内存大小

白昼怎懂夜的黑 提交于 2019-12-05 19:35:44
在运行java桌面应用程序的时候,有时候会因为jvm内存太小,从而内存溢出,程序崩溃。 可是通过修改 eclipse.ini 中的参数,来实现修改jvm的内存大小。 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存

堆和栈

此生再无相见时 提交于 2019-12-05 06:29:58
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种内存管理方式; (2)数据结构场景下,堆与栈表示两种常用的数据结构。 1.程序内存分区中的堆与栈 1.1 栈简介 栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码: 其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量,比如上面代码中变量 s 的地址小于变量 b 的地址,p2 地址小于 s 的地址。栈中存储的数据的生命周期随着函数的执行完成而结束。 1.2 堆简介 堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收,分配方式类似于链表。参考如下代码: 其中 p1 所指的 10 字节的内存空间与 p2 所指的 10 字节内存空间都是存在于堆。堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,即 p2 指向的地址并不一定大于 p1 所指向的内存地址,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存

堆内存结构是怎么样的?

假如想象 提交于 2019-12-05 02:38:08
站在垃圾收集器的角度来看,可以把内存分为新生代与老年代。内存的分配规则取决于当前使用的是哪种垃圾收集器的组合,以及内存相关的参数配置。 往大的方向说,对象优先分配在新生代的Eden区域,而大对象直接进入老年代。 第一, 新生代的Eden区域,对象优先分配在该区域,同时JVM可以为每个线程分配一个私有的缓存区域,称为TLAB(Thread Local Allocation Buffer),避免多线程同时分配内存时需要使用加锁等机制而影响分配速度。TLAB在堆上分配,位于Eden中。 第二、新生代的Survivor区域。当Eden区域内存不足时会触发Minor GC,也称为新生代GC,在Minor GC存活下来的对象,会被复制到Survivor区域中。我认为Survivor区的作用在于避免过早触发Full GC。如果没有Survivor,Eden区每进行一次Minor GC都把对象直接送到老年代,老年代很快便会内存不足引发Full GC。新生代中有两个Survivor区,我认为两个Survivor的作用在于提高性能,避免内存碎片的出现。在任何时候,总有一个Survivor是empty的, 在发生Minor GC时,会将Eden及另一个的Survivor的存活对象拷贝到该empty Survivor中,从而避免内存碎片的产生。 第三、老年代。老年代放置长生命周期的对象

Eclipse.ini参数简介

淺唱寂寞╮ 提交于 2019-12-04 22:04:09
本篇文章讲述eclipse.ini参数的含义和设置。eclipse.ini中有如下参数: -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 下面我们一一进行回答 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按 照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据

[转]Windows内存堆内容整理总结

无人久伴 提交于 2019-12-04 19:48:24
在系统安全研究中,堆,是一个极其重要的内存区域以及研究的热点。堆,区别于栈区、全局数据区以及代码区,它的主要作用是允许程序在运行时动态地申请某个大小的内存空间。本文将从宏观到微观,简单梳理总结一下Windows系统中的堆相关的知识以及常见的堆利用漏洞,主要参考了看雪的《0day》,方便自己后续的学习。 注:本文更多是自己的整理,已经有很多师傅更详细地介绍过Windows堆了。 Windows堆的历史 到目前为止,由于微软并没有完全公开Windows中堆管理的细节,所以现在对Windows下堆的了解都是基于技术爱好者、黑客、安全专家以及逆向工程师等的个人研究成果。这些前辈的努力工作,为我们留下了极其宝贵的研究资料。现在,我们已经可以基本清楚了部分Windows系统中的堆管理策略、与攻击相关的数据结构和算法等。此处,有几位技术精湛、贡献卓越的前辈值得我们铭记: Halvar Flake:2002年的Black Hat大会上,他在演讲“Third Generation Exploitation”中首次挑战Windows的堆溢出,并揭秘了堆中一些重要的数据结构和算法。 David Litchfield: David 在2004年的Black Hat上演讲的"Windows Heap Overflows"首次比较全面地介绍了Windows 2000平台下堆溢出地技术细节,包括重要数据结构

eclipse.ini配置文件

北城余情 提交于 2019-12-04 18:38:49
vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 下面我们一一进行回答 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配 JVM初始分配的内存由-Xms指定