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

如何分析GHC在使用Stack编译项目时使用了多少内存?

在使用Stack编译项目时,可以通过分析GHC(Glasgow Haskell Compiler)的内存使用情况来确定其使用了多少内存。以下是一些方法和工具可以帮助您进行内存分析:

  1. 使用GHC的内置选项:GHC提供了一些选项来帮助您分析内存使用情况。您可以尝试使用以下选项来获取更详细的内存使用信息:
    • -s:该选项会在编译过程结束后输出内存统计信息,包括内存分配和回收情况。
    • -h:该选项会生成一个堆分配的分析报告,显示堆内存的使用情况。
  • 使用Heap Profiling工具:GHC提供了Heap Profiling工具,可以帮助您更详细地分析内存使用情况。您可以按照以下步骤进行配置和分析:
    • 在项目的Stack配置文件中,将ghc-options部分添加-prof -fprof-auto -rtsopts选项。
    • 运行stack build --profile命令来构建带有Heap Profiling支持的项目。
    • 运行编译后的可执行文件,并使用+RTS -p选项来启用Heap Profiling。
    • 运行程序并执行一些典型的操作,以便收集足够的数据。
    • 运行hp2ps命令将Heap Profiling数据转换为可视化报告,例如:hp2ps -c program.hp
    • 打开生成的报告文件,查看内存使用情况和分析结果。
  • 使用操作系统工具:您还可以使用操作系统提供的工具来监视和分析GHC的内存使用情况。以下是一些常用的工具:
    • top:用于实时监视进程的资源使用情况,包括内存占用。
    • htop:类似于top,但提供了更多的交互和过滤选项。
    • ps:用于查看进程的详细信息,包括内存占用。
    • pmap:用于显示进程的内存映射情况,包括各个内存段的大小和权限。

请注意,以上方法和工具可能需要根据您的操作系统和具体情况进行适当调整和配置。此外,根据您的项目和需求,可能还有其他更专业的工具和技术可供选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

泛型和元编程的模型:Java, Go, Rust, Swift, D等

装箱是指我们把所有的东西都放在统一的 "盒子 "里,使它们的行为方式都一样。通常是通过堆上分配内存,只在数据结构中放指针来实现的。...这种方式虽然被Haskell类型类使用,但GHCGHC是Haskell编译器)通过内联和特殊化,也可以做单态化优化。...Swift编译器能够模块内和跨模块使用注解为@inlinable的函数进行单态化处理(monomorphize)和内联泛型,以避免这些成本,其使用启发式算法来估算代码会膨胀多少。...我不知道有什么语言使用这种技术,但是C++编译器和Java虚拟机使用profile-guided优化来了解某个通用调用点主要作用于某些类型的对象,会做类似的事情。...例如如果在日志调用中使用了一个封装函数的宏,而在封装函数的实现中出错,编译器的错误将直接指向错误所在的你的代码,而非指向宏。

3K30

从惰性IO说起_Haskell笔记6

data/lines.txt" ReadMode (\handle -> do contents <- hGetContents handle putStr contents ) 从硬盘读文件并不会一次性全读入内存...二.Data.ByteString 既然从系统读取文件需要考虑性能采用Buffer,那读入内存之后呢?又该如何存储,如何操作?...List,就像'a' : 'b' : 'c' : []“承诺”会有一个'a'开头的List,这个List有多长,占多少空间,真正需要求值之前都是未知的(也没必要知道,所以允许存在无限长的List,而不用担心如何存储的问题...make sourceFile编译执行外,还有一种直接run源码的方式: $ runhaskell testArgs.hs -b -c /absolute/path/to/ghc-8.0.1/bin/ghc...putStr contents ) 找不到文件,或者其他原因导致readFile异常,会输出提示信息: $ runhaskell ioException.hs .

2.3K30
  • 如何对比 F-Stack 与 Seastar 这两个网络编程框架?

    F-Stack使用纯C开发(部分第三方组件使用了C++,F-Stack进行了封装),容易上手;Seastar使用了C++14,Future-Promise, Shared-nothing,message-passing...F-Stack的协议栈移植自FreeBSD 11.0,功能完善但也冗余(去除了部分模块未编译进F-Stack),调试分析工具完善,运行稳定;Seastar按照RFC协议自研协议栈,更精简,但外网运行不稳定...Seastar有自己的内存管理系统(类似tcmalloc),并且如果在启动开启了hugepages参数并制定使用的hugepage路径后可以使用巨页并实现收发包的零拷贝;F-Stack目前没有自己的内存管理系统...我们的测试业务在外网上进行测试传输较大文件或大并发小文件请求,必现协议栈挂死完全无法访问的问题,外在表现是滑动窗口降为0。...Q:单核性能提升有多少 A:目前版本的F-Stack单核性能比内核协议栈高20-50%左右,多核优势更明显,后续会持续进

    8.5K00

    F-Stack与Seastar对比

    本文是将知乎网友的提问 《如何评价腾讯开源的基于 DPDK 和 BSD 协议栈的网络框架 f-stack?》,将回答讨论内容和我们的一些想法进行了整理。...F-Stack使用纯C开发(部分第三方组件使用了C++,F-Stack进行了封装),容易上手;Seastar使用了C++14,Future-Promise, Shared-nothing,message-passing...F-Stack的协议栈移植自FreeBSD 11.0,功能完善但也冗余(去除了部分模块未编译进F-Stack),调试分析工具完善,运行稳定;Seastar按照RFC协议自研协议栈,更精简,但外网运行不稳定...Seastar有自己的内存管理系统(类似tcmalloc),并且如果在启动开启了hugepages参数并制定使用的hugepage路径后可以使用巨页并实现收发包的零拷贝;F-Stack目前没有自己的内存管理系统...我们的测试业务在外网上进行测试传输较大文件或大并发小文件请求,必现协议栈挂死完全无法访问的问题,外在表现是滑动窗口降为0。

    3.2K90

    一个产品级MCU内存管理方案

    局部变量进入函数从栈空间分配,退出函数前释放。全局变量则在整个程序运行其中一直使用程序编译就已经分配了RAM空间。 那还有没有第三种变量呢?可以说没有。...当512消耗尽,再从大内存池申请第二块512字节大内存。当小内存释放,判断小块内存池是否为空,如为空,将小块内存池释放回大内存池。那如何管理这个小内存池呢?...2 利用不使用的align跟pad成员,记录分配时间跟分配对象(记录哪个驱动申请的内存) 通过上面优化后,就可以统计已经分配了多少内存,还有多少空闲内存,哪个模块申请了最多内存等数据。...先把内存池改小,编译通过之后,分析 map文件,用了较多全局变量的统统改小或者改为动态申请。分析map文件,还可以检查还有没有使用库里面的malloc。...又一个内存池?应该是要优化掉startup_stm32f40_41xxx.o 启动代码,是栈跟堆用的RAM. 由于编译器的优化,项目没用到的代码没有编译进来,上面的map数据并不完整。

    98721

    铁定不纯的IO_Haskell笔记5

    写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...比如(伪)随机数、I/O等,一个纯函数的随机数发生器肯定是不存在的,那要如何处理这种场景呢?...输入空行会退出,输入其它内容会按行原样输出 也可以编译得到可执行文件: $ ghc --make ....把处理结果写入文件,符合预期 四.System.IO 之前使用的getLine、putStrLn都是System.IO模块里的函数,常用的还有: -- 输出 print :: Show a => a -...惰性I/O 字符串本身是一个惰性List,getContents也是惰性I/O,不会一次性读入内容放到内存中 toUpperCase'的示例中会一行一行读入再输出大写版本,因为只输出的时候才真正需要这些输入数据

    1.3K30

    01 深入理解JVM的内存区域

    那么程序开始运行后,都是如何涉及到各内存区域的呢?   ...等)保存在 Stack 中,对象类型 Stack 中保存地址, Heap 中保存值);   栈也叫栈内存,是在线程创建创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题...局部变量表 所需的内存空间在编译期间完成分配,方法运行之前,该局部变量表所需要的内存空间是固定的,运行期间也不会改变。   ...4、本地方法栈 与 Stack 相似,Stack 为 JVM 提供执行 Java 方法的服务,本地方法栈 则为 JVM 提供使用 native 方法的服务。...第 2 步,JVM 分配内存。JVM 获得 64M 内存,就开始得瑟了,首先给 Heap 分配内存,然后给 Stack 也分配好。 第 3 步,文件检查 和 分析 class 文件。

    57550

    内存泄漏的定位与排查:Heap Profiling 原理解析

    本文将介绍一些常见的 Heap Profiler 的实现原理及使用方法,帮助读者更容易地理解 TiKV 中相关实现,或将这类分析手段更好地运用到自己项目中。...Heap Profiling 通常指对应用程序的堆分配进行收集或采样,来向我们报告程序的内存使用情况,以便分析内存占用原因或定位内存泄漏根源。...回顾 “Heap Profiling 是如何工作的” 一节,Heap Profiler 通常的做法是直接将自己集成在内存分配器内,当应用程序进行内存分配拿到当前的 stack trace,而 Go 正是这么做的...默认情况下,每当我们的程序分配了 1g 内存,或每当程序的内存使用高水位线增加了 100mb ,都会进行一次 Heap Profile 的 dump。这些参数可以通过环境变量来修改。...BPF 的问题与此类似,我们可以挂个钩子 brk/sbrk 上,当用户态真正需要向内核申请扩容堆内存,对当前的 stack trace 进行记录。

    1.5K50

    简单理解JVM优化

    栈上分配(Stack Allocation):如果确定一个对象不会逃逸出方法之外,那让这个对象栈上分配内存将会是一个很不错的主意。...,执行效率最高的是即时编译器,所以我们做JIT优化的目的是尽量使代码使用即时编译器 参数设置: -server ---- 2、增加内联函数的可能性 增加函数内联的可能性能减少栈帧的创建,节约内存空间 参数设置...: 使用final修饰函数向编译器建议可以内联,启动参数不宜设置,注意只是建议,具体是否内联看JVM决定 ---- 3、提高使用即时编译器的可能性 小方法:写方法尽量不要写得太大,让JVM尽可能使用即时编译编译代码...,该值是指当方法被调用多少次后,就编译为机器码,client模式默认为1500次,server模式默认为1万次,可以启动添加-XX:CompileThreshold=10000来设置该值。...jhat:虚拟机堆转储快照分析工具,和jmap配合使用 jhat内置了一个微型的HTTP/HTML服务器,jmap生成dump文件的分析结果后,可以浏览器中查看。

    63020

    Python性能分析指南

    分析一个程序的性能可以归结为回答4个基本的问题: 1.它运行的有多块? 2.那里是速度的瓶颈? 3.它使用了多少内存? 4.哪里发生了内存泄漏?...程序使用了多少内存? 现在我们对计时有了较好的理解,那么让我们继续弄清楚程序使用了多少内存。...想要观察你的函数使用了多少内存,像下面这样执行: ? 一旦程序退出,你将会看到看起来像这样的输出: ?...当计数器到达零,cPython解释器就知道该对象不再被使用,所以删除对象,释放占用的内存。 如果程序中不再被使用的对象的引用一直被占有,那么就经常发生内存泄漏。...回顾一下,objgraph 使我们可以: 显示占据python程序内存的头N个对象 显示一段时间以后哪些对象被删除活增加了 我们的脚本中显示某个给定对象的所有引用 努力与精度 本帖中,我给你显示了怎样用几个工具来分析

    89650

    更轻量级的 V8 引擎

    2018 年末,为了大幅减少 V8 的内存使用量,我们启动了一个名为 V8 Lite 的项目。...Lite 模式 为了优化 V8 的内存使用,我们首先需要了解 V8 如何使用内存以及哪些对象类型 V8 堆中占了很大的比例。...这些信息存储反馈向量中,这些向量 V8 堆内存使用了很大的一部分。...对于那些明显想要权衡性能以提高内存使用率的程序而言,这是一个非常不错的结果。但是执行此项工作的过程中,我们意识到通过使 V8 变得更懒惰,可以实现节省精简模式的大部分内存,而不会影响性能。...为了避免这种浪费,现在编译字节码不收集源位置(假设未连接调试器或分析器),仅在实际生成堆栈跟踪(例如,调用 Error.stack 或将异常的栈跟踪打印到控制台)才收集源。

    1.3K20

    前端阿瓜每周速记(2020 第 34 周)

    内存中? 内存的分配策略是如何的呢? 为什么是内存,不是 CPU?不是外存?本瓜面试中被问过,面试官多半是后端或架构师 不要方,抱紧我。芜湖起飞!...编译确定大小,运行时进行分配。 堆内存优缺: 优:编译器不必知道要从堆里分配多少存储空间,保存数据更灵活。 缺:运行时请求操作系统分配给自己内存,分配和销毁都要占用时间,效率非常低。...简单做了个图: 内存管理 几乎所有的语言的内存管理都要进行下面这三个步骤: 分配你所需要的内存使用分配到的内存(读、写)。 不需要将其释放或归还。...JQuery 1.8.2 XSS 攻击 本司安全组扫码代码安全检测出了本瓜所在项目存在 Jqurey 版本过低导致的 XSS 攻击(中危)。...SNYK-JS-JQUERY-565129 没道理啊,都是 Vue 项目,哪里来的 JQuery,后来全局搜索发现,还真有!原因是 svn 上后台的老旧模板引用了 JQuery 依赖。

    64830

    初识协程栈

    详细解释如下: 代码编译编译器会插入分配和释放栈内存的指令,比如像下面这段简单的程序一样: 一段简单的加法示例代码: // 源代码 package main func main() { a :...进程运行过程中栈内存的分配和释放的时机和大小值由编译器决定。 线程栈 什么是线程栈? 答:创建一个线程使用malloc从堆上分配一块连续内存作为线程的栈空间。...谁决定了代码在运行过程中,从栈空间(线程栈)分配或释放多少内存? 答:同进程,编译器决定。 协程栈 什么是协程栈?...答:使用`go`关键字创建一个协程,Go运行时从堆上分配一块连续内存作为协程的栈空间。 谁决定了协程栈的栈空间的大小范围?...指令 线程栈 创建线程 创建线程的运行时,pthread_attr_setstack 虚拟内存的用户空间进程堆区域 编译器,汇编SUB、ADD指令 协程栈 使用go关键字运行函数 Go运行时,malg

    18730

    Android Native 内存泄漏系统化解决方案

    随着Android的发展,Google也提供了栈回溯的一些分析方法,但是这些方案存在下面几个问题: 1.栈回溯的环节都使用的libunwind,这种获取方式消耗较大,Native代码较多的情况下,频繁调用会导致应用很卡...因此,如何进行高效的栈回溯、搭建系统化的Android Native内存分析体系显得格外重要。...这里需要格外注意,某些不需要插桩的函数可以使用__attribute__((no_instrument_function))来向编译器声明。 如何记录这些调用信息?...缺点: 编译器插桩,体积变大,不能直接作为线上产品使用,只用于内存测试包。这个问题可以通过持续集成的手段解决,每次项目出库将C++项目产出普通库及对应的内存测试库。...不使用官方方式开启该功能,比较麻烦,不利于自动化测试,可以编译一份放到自己的项目中,hook所有内存函数,跳转到malloc_debug的监控函数leak_xxx执行,这样malloc_debug就监控了所有的内存申请

    1.1K32

    技术干货 | 理解 Go 内存分配

    Golang 简要内存划分 可以简单的认为 Golang 程序启动,会向操作系统申请一定区域的内存,分为栈(Stack)和堆(Heap)。...下面开始逐行进行分析,解析调用时,go 运行时是如何内存进行分配的。 当代码运行到第6行,进入 main 函数,会在栈上创建一个 Stack frame,存放本函数中的变量信息。...面对 sharing up 场景,go 通常会将变量分配到堆中,如下图所示: 通过上面的分析,可以看到面对被调用的函数返回一个指针类型将对象分配到栈上会带来严重的问题,因此 Go 将变量分配到了堆上...使用 go build 命令确定内存逃逸情况 值得注意的是,Go 判断一个变量或对象是否需要逃逸到堆的操作,是在编译器完成的;也就是说,当代码写好后,经过编译编译后,会在二进制中进行特定的标注,声明指定的变量要被分配到堆或栈...可以使用如下命令在编译期打印出内存分配逻辑,来具体获知特定变量或对象的内存分配位置。 查看 go help 可以看到 go build 其实是调用 go tool compile。

    51220

    技术干货 | 理解 Go 内存分配

    Golang 简要内存划分 ---- 可以简单的认为 Golang 程序启动,会向操作系统申请一定区域的内存,分为栈(Stack)和堆(Heap)。...下面开始逐行进行分析,解析调用时,go 运行时是如何内存进行分配的。 当代码运行到第6行,进入 main 函数,会在栈上创建一个 Stack frame,存放本函数中的变量信息。...面对 sharing up 场景,go 通常会将变量分配到堆中,如下图所示: 通过上面的分析,可以看到面对被调用的函数返回一个指针类型将对象分配到栈上会带来严重的问题,因此 Go 将变量分配到了堆上...使用 go build 命令确定内存逃逸情况 ---- 值得注意的是,Go 判断一个变量或对象是否需要逃逸到堆的操作,是在编译器完成的;也就是说,当代码写好后,经过编译编译后,会在二进制中进行特定的标注...可以使用如下命令在编译期打印出内存分配逻辑,来具体获知特定变量或对象的内存分配位置。 查看 go help 可以看到 go build 其实是调用 go tool compile。

    6.5K40

    Task之任务的创建

    特例是C++语句被编译后,会产生浮点指令,因此任务中调用C++语句,就一定要使能这个选项。...如果分配的数值过大,就会增加一点点初始化时间,并浪费部分内存空间,影响倒是不大;而分配的过小,就有栈溢出的风险,这可是致命的了。因此,开发过程中,要评估一下具体的数值。那如何才能知道分配的是否合适呢?...可以Shell里使用checkStack()来检查,因为创建任务Stack的每个Byte默认被填充为0xee,checkStack()通过检查Stack中0xee的变化来判断Stack使用边界。...不过,如果使用了选项VX_NO_STACK_FILL,或者设置Kernel的配置参数VX_GLOBAL_NO_STACK_FILL为TRUE,Stack的内容就不会被填充0xee了,checkStack...因此,当项目的实时性需求非常高,可以考虑使用taskCreate()和taskActivate()的组合。 还有一个POSIX风格的API可以用来创建任务或者获得任务句柄,taskOpen()。

    2.4K30

    编写与优化 Go 代码(一)

    你能把它表述为 "少于时间 T 的情况下解决一个大小为 N 的问题 "吗?你是想减少内存使用吗?减少多少?慢多少是可以接受的?你愿意放弃什么来换取更低的空间需求?...[Gil Tene的"如何不测量延迟"](https://youtu.be/lJ8ydIuPFeU "Gil Tene的 "如何不测量延迟"") 性能目标必须具体,你一定能够使一些东西更快。...不过较底层的技术栈的优化可以放到项目研发的后期再做,对系统性能有了全面了解之后再去做更合适。当系统还不完整,难以得到正确的全局性能视角。...他的许多建议现在都由编译器自动完成。程序员的工作是使用编译器不能自动进行的那个转换优化。...一些三角函数的算法使用查表作为计算的起点。 如果你的程序使用了太多的内存,也可以走另一条路。通过消耗更多 CPU 减少内存空间的使用。与其存储内容,不如每次都计算它们。

    57110
    领券