- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题与 answer 相关。给前任question about memory handling由 Perl。我了解到可以通过在可用标量上显式使用 undef
函数并使用 Devel::Peek
或 Devel::Size< 在 Perl 中释放内存
或这样的人可以看到为一个标量分配了多少内存。在所有这些情况下,调试的标量都在其范围内使用。
但是是否可以在 Perl 解释器的级别上调试变量范围之外的分配内存之类的东西?比如在当前解释器中为所有标量的“事物”搜索所有分配的内存并打印它们的相关数据,比如当前值等?
如果是这样的话,如果一个人已经拥有这些信息,那么一个人甚至能够释放已知的内存吗?就像在标量上调用 undef
一样,但没有标量,更底层的东西,例如 Devel::Peek
的那些“事物”输出。
我正在考虑的是在请求后执行 mod_perl 清理处理程序,扫描当前的 mod_perl 解释器以查找大块数据并手动释放它们。仅仅因为我认为分配的大块数据不再有用了,即使 Perl 不这么认为:
Finally and perhaps the biggest win is memory re-use: as calls are made into Perl subroutines, memory allocations are made for variables when they are used for the first time. Subsequent use of variables may allocate more memory, e.g. if a scalar variable needs to hold a longer string than it did before, or an array has new elements added. As an optimization, Perl hangs onto these allocations, even though their values "go out of scope".
https://perl.apache.org/docs/2.0/user/intro/overview.html#Threads_Support
我可以找到很多关于低级内存访问的监视和调试包,但还没有提示如何在 Perl 中的某些低级 Perl 结构上调用 undef
函数。没有任何 XS 之类的东西可能根本不可能......
最佳答案
is it possible to debug things like allocated memory outside the scope of variables
真的没有这样的内存。肯定需要在变量之外分配的任何内存。正如您自己指出的那样,为变量分配的内存构成了最“浪费”的空间。
but no hint yet how one could call something like the undef function on some low level Perl struct in Perl.
因为没有这样的结构体。
Just like calling
undef
on a scalar, but without the scalar, something more low level, like on those "things" output of Devel::Peek.
Devel::Peek 唯一的函数,Dump
,输出东西in 变量。正如你所说,undef
是你想要清除这些的。
从上面,很明显你想知道如何释放与 subs 中的变量相关的内存。
您还忽略了一个事实,即许多运算符都有一个关联变量(称为“目标”),它们在其中返回结果。
清除所有这些变量的一种简单方法是有选择地清除符号表 (%::
)。这将有效地“卸载”每个模块。确保不要清除核心组件(perl -E'say for sort keys %::'
)。并且不要忘记清除 %INC
以便重新加载模块。
如果清除符号表是您想要采取的方法,那么尽早拍摄 %::
的快照并在适当的时候恢复该快照可能会降低风险和耗时清除符号。
如果您不想重新加载模块,您可以尝试定位每个子,并取消定义它们的变量,然后取消定义其操作的变量。
一个子的变量存在于它的pads 中。 .方便的是,操作码目标也是如此。 sub 经历的每个递归级别都有一个填充。
给定一个对 sub 的引用,您可以在 sub 的 pad 中找到变量。您可以引用PadWalker有关如何执行此操作的示例。您实际上不能使用 PadWalker,因为它只为每个变量名返回一个变量,即使有多个变量(由于使用相同名称声明了多个变量,或者由于递归)。
捕获的变量和 我们的
变量应该保持不变。可以检测填充条目是否是其中之一。 (再次,请参阅 PadWalker。)
(显然,您也可以考虑释放潜艇的额外衬垫!)
你如何找到所有的潜艇?好吧,浏览符号表将为您提供其中的大部分。找到匿名的会比较棘手。
最有效的方法是简单地终止 mod_perl 线程/进程。一个新的干净的将自动产生。它也是最容易实现的,因为它只是一个配置更改(将 MaxRequestsPerChild
设置为 1
)。
另一种形式的内存浪费是内存泄漏。这又是一个大问题,所以我不涉及它。
关于Perl:如何在不访问 Perl 变量的情况下释放为标量分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527245/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!