什么是POSIX?我已阅读维基百科的文章,每次遇到这个词时我都会阅读它.事实是,我从来没有真正理解它是什么.
任何人都可以通过解释"对POSIX的需求"向我解释一下吗?
我在这里有这个尾递归函数:
def recursiveFunction(n, sum):
if n < 1:
return sum
else:
return recursiveFunction(n-1, sum+n)
c = 998
print(recursiveFunction(c, 0))
Run Code Online (Sandbox Code Playgroud)
它可以工作到n = 997,然后它就会中断并吐出"比较时超出的最大递归深度" RuntimeError.这只是一个堆栈溢出?有办法解决它吗?
我在Linux下运行的Java应用程序有问题.
当我使用默认的最大堆大小(64 MB)启动应用程序时,我看到使用tops应用程序为应用程序分配了240 MB的虚拟内存.这会在计算机上创建一些其他软件的问题,这些软件相对资源有限.
据我所知,无论如何都不会使用保留的虚拟内存,因为一旦达到堆限制OutOfMemoryError就会被抛出.我在Windows下运行相同的应用程序,我发现虚拟内存大小和堆大小相似.
无论如何我可以在Linux下配置用于Java进程的虚拟内存吗?
编辑1:问题不在于堆.问题是,如果我设置一个128 MB的堆,那么Linux仍然会分配210 MB的虚拟内存,这是不需要的.**
编辑2:使用ulimit -v允许限制虚拟内存量.如果大小设置低于204 MB,则应用程序将不会运行,即使它不需要204 MB,只需64 MB.所以我想了解为什么Java需要这么多虚拟内存.这可以改变吗?
编辑3:系统中运行了几个其他应用程序,它们是嵌入式的.系统确实有虚拟内存限制(来自评论,重要细节).
有没有办法让Python程序确定它当前使用了多少内存?我已经看过有关单个对象的内存使用情况的讨论,但我需要的是进程的总内存使用量,以便我可以确定何时需要开始丢弃缓存数据.
从官方文档(来源):
process.memoryUsage()
返回一个对象,描述以字节为单位测量的Node进程的内存使用情况.
Run Code Online (Sandbox Code Playgroud)var util = require('util'); console.log(util.inspect(process.memoryUsage()));这将产生:
Run Code Online (Sandbox Code Playgroud){ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }heapTotal和heapUsed是指V8的内存使用情况.
究竟rss,heapTotal和heapUsed代表什么?
这似乎是一个微不足道的问题,但我一直在寻找,到目前为止我找不到一个明确的答案.
所以我在远程盒子上看着一个带有jmap的堆,我想强制垃圾收集.如果不突然进入jvisualvm或jconsole和朋友,你怎么做?
我知道你不应该在强制垃圾收集的实践中 - 你应该弄清楚为什么堆很大/正在增长.
我也意识到System.GC()实际上并没有强制进行垃圾收集 - 它只是告诉GC你希望它发生.
话虽如此,有办法轻松做到这一点吗?我失踪了一些命令行应用程序?
在POSIX系统上,终止信号通常具有以下顺序(根据许多MAN页面和POSIX规范):
SIGTERM - 礼貌地要求进程终止.它将正常终止,清理所有资源(文件,套接字,子进程等),删除临时文件等.
SIGQUIT - 更有力的请求.它应该终止不正常,仍然清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息; 在某些系统上也会写入核心转储(无论信号是否被应用程序捕获).
SIGKILL - 最有力的要求.甚至没有要求该过程做任何事情,但系统将清理过程,无论是否喜欢.最有可能是编写核心转储.
SIGINT如何适应这张照片?当用户点击CRTL + C时,CLI进程通常由SIGINT终止,但是后台进程也可以由SIGINT使用KILL实用程序终止.我在规范或头文件中看不到的是SIGINT是否比SIGTERM更强或更强,或者SIGINT和SIGTERM之间有任何区别.
更新:
到目前为止,我发现的终止信号的最佳描述是在GNU LibC文档中.它很好地解释了SIGTERM和SIGQUIT之间存在预期的区别.
它说关于SIGTERM:
这是礼貌地要求程序终止的正常方式.
它说关于SIGQUIT:
[...]并在终止进程时生成核心转储,就像程序错误信号一样.您可以将此视为用户"检测到"的程序错误情况.[...]在处理SIGQUIT时最好省略某些类型的清理.例如,如果程序创建临时文件,它应该通过删除临时文件来处理其他终止请求.但是SIGQUIT最好不要删除它们,以便用户可以与核心转储一起检查它们.
而SIGHUP也解释得很好.SIGHUP实际上不是终止信号,它只是意味着用户的"连接"已经丢失,因此应用程序不能指望用户读取任何进一步的输出(例如stdout/stderr输出),并且没有输入可以从用户不再.对于大多数意味着他们退出的应用程序.从理论上讲,应用程序还可以决定在收到SIGHUP时进入守护进程模式,现在作为后台进程运行,将输出写入已配置的日志文件.对于已经在后台运行的大多数守护进程,SIGHUP通常意味着他们将重新检查其配置文件,因此您在编辑配置文件后将其发送到后台进程.
但是,除了CRTL + C发送的SIGINT之外,此页面上没有有用的SIGINT解释.是否有理由以不同于SIGTERM的方式处理SIGINT?如果是这样,那将是什么原因以及如何处理不同?
这个问题旨在填补关于该主题的良好免费信息的真空.
我相信一个好的答案将适合一个大的答案或至少在几个答案.
主要目标是为完整的初学者提供足够的信息,以便他们可以自己学习手册,并能够理解与分页相关的基本操作系统概念.
建议的指导方针:
相关问题以及为什么我认为它们不是愚蠢的:
x86页表如何工作?:标题与此问题几乎相同,但是正文询问与cr3和TLB相关的具体问题.那个问题是这个问题的一个子集.
x86虚拟化如何工作:正文仅询问源.
我的应用程序被oom-killer杀死.它是Ubuntu 11.10在没有交换的现场USB上运行,而且PC有1 Gig的RAM.运行的唯一应用程序(除了所有内置的Ubuntu东西)是我的程序flasherav.请注意/ tmp是内存映射的,并且在崩溃时有大约200MB的文件(因此占用了大约200MB的RAM).
我试图理解如何分析om-killer日志,这样我就可以理解所有内存的使用位置 - 也就是那些不同的块会加起来~1 gig导致oom-killer踢在?一旦我理解了这一点,我就可以努力减少罪犯的使用,以便应用程序可以在1 GB内存的计算机上运行.我的具体问题是.
为了分析这种情况,我总结了"total_vm"列,我只获得了609342KB(在/ tmp中添加到200MB时仍然只有809MB).也许我对"total_vm"列是错误的 - 它包括已分配但未使用的内存加共享内存.如果是,那么它不应该过分夸大实际使用的内存(因此我不应该忘记内存),对吧?是否有其他内存正在使用中未列入下面的列表中?
[11686.040460] flasherav invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
[11686.040467] flasherav cpuset=/ mems_allowed=0
[11686.040472] Pid: 2859, comm: flasherav Not tainted 3.0.0-12-generic #20-Ubuntu
[11686.040476] Call Trace:
[11686.040488] [<c10e1c15>] dump_header.isra.7+0x85/0xc0
[11686.040493] [<c10e1e6c>] oom_kill_process+0x5c/0x80
[11686.040498] [<c10e225f>] out_of_memory+0xbf/0x1d0
[11686.040503] [<c10e6123>] __alloc_pages_nodemask+0x6c3/0x6e0
[11686.040509] [<c10e78d3>] ? __do_page_cache_readahead+0xe3/0x170
[11686.040514] [<c10e0fc8>] filemap_fault+0x218/0x390
[11686.040519] [<c1001c24>] ? __switch_to+0x94/0x1a0
[11686.040525] [<c10fb5ee>] __do_fault+0x3e/0x4b0
[11686.040530] [<c1069971>] ? enqueue_hrtimer+0x21/0x80
[11686.040535] [<c10fec2c>] handle_pte_fault+0xec/0x220
[11686.040540] [<c10fee68>] handle_mm_fault+0x108/0x210
[11686.040546] [<c152fa00>] ? vmalloc_fault+0xee/0xee
[11686.040551] [<c152fb5b>] do_page_fault+0x15b/0x4a0 …Run Code Online (Sandbox Code Playgroud) 像'ps'和'top'这样的工具会报告各种内存使用情况,例如VM大小和Resident Set Size.但是,这些都不是"真正的"内存使用情况:
我发现Linux报告的私有脏RSS是最接近"真实"内存使用的东西.这可以通过对所有Private_Dirty值求和来获得/proc/somepid/smaps.
但是,其他操作系统是否提供类似功能?如果没有,有哪些替代方案?特别是,我对FreeBSD和OS X感兴趣.