是否有任何现成的解决方案来记录系统启动时的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便稍后进行分析.
我正在研究基于Linux 2.4的嵌入式系统.我需要调试与内存消耗相关的问题.我的应用程序会自动启动每个系统启动.我需要从定期间隔(尽可能经常)获取带时间戳的数据的方法,这样我就可以追踪问题.
我的问题的症状:当系统启动时,它启动了我的主应用程序和GUI,以可视化系统的主要参数.GUI基于GTK +(X服务器).如果我禁用GUI和X服务器,那么我的应用程序工作正常.如果我启用GUI和X服务器,当我在主板上安装256 MiB或512 MiB的物理内存时,它不起作用.如果我安装了1 GiB内存,那么一切正常.
在下面的代码中,我们进行了listType.getDescription()
两次调用:
for (ListType listType: this.listTypeManager.getSelectableListTypes())
{
if (listType.getDescription() != null)
{
children.add(new SelectItem( listType.getId() , listType.getDescription()));
}
}
Run Code Online (Sandbox Code Playgroud)
我倾向于重构代码以使用单个变量:
for (ListType listType: this.listTypeManager.getSelectableListTypes())
{
String description = listType.getDescription();
if (description != null)
{
children.add(new SelectItem(listType.getId() ,description));
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是JVM以某种方式针对原始代码进行了优化,尤其是嵌套调用children.add(new SelectItem(listType.getId(), listType.getDescription()));
.
比较两个选项,哪一个是首选方法,为什么?这就是内存占用,性能,可读性/易用性以及其他我现在不想到的内容.
后一个代码片段何时变得比前者更有利,也就是说,listType.getDescription()
当使用临时局部变量变得更加理想时,是否存在任何(近似)调用次数,因为listType.getDescription()
总是需要一些堆栈操作来存储this
对象?
我是Go的新手,试图找出它如何管理内存消耗.
我的一个测试项目中的内存有问题.我不明白为什么当我的程序运行很长时间时,Go会使用越来越多的内存(从不释放它).
我正在运行下面提供的测试用例.在第一次分配后,程序使用近350 MB的内存(根据ActivityMonitor).然后我尝试释放它,ActivityMonitor显示内存消耗增加一倍.为什么?
我使用Go 1.0.3在OS X上运行此代码.
这段代码有什么问题?在Go程序中管理大变量的正确方法是什么?
在实现使用大量时间和内存的算法时,我遇到了另一个与内存管理相关的问题; 运行一段时间后,它会抛出"内存不足"异常.
package main
import ("fmt"
"time"
)
func main() {
fmt.Println("getting memory")
tmp := make([]uint32, 100000000)
for kk, _ := range tmp {
tmp[kk] = 0
}
time.Sleep(5 * time.Second)
fmt.Println("returning memory")
tmp = make([]uint32, 1)
tmp = nil
time.Sleep(5 * time.Second)
fmt.Println("getting memory")
tmp = make([]uint32, 100000000)
for kk, _ := range tmp {
tmp[kk] = 0
}
time.Sleep(5 * time.Second)
fmt.Println("returning memory")
tmp = make([]uint32, 1)
tmp = nil …
Run Code Online (Sandbox Code Playgroud) 我最近非常喜欢Upstart.以前我一直在使用God,Monit和Bluepill,但我并不喜欢这些解决方案,所以我试试Upstart.
我一直在使用Foreman gem为我的进程生成一些基本的Upstart配置文件/etc/init
.但是,这些生成的文件只处理崩溃进程的重新生成.我想知道是否有可能告诉Upstart重新启动一个消耗> 150mb
内存的过程,就像Monit,God或Bluepill一样.
我通读了Upstart文档,这看起来就像我正在寻找的东西.虽然我不知道如何配置这样的东西.
我基本上想要的很简单.web
如果内存使用率为> 150mb
ram,我想重新启动我的进程.这些是我的文件:
|-- myapp-web-1.conf
|-- myapp-web-2.conf
|-- myapp-web-3.conf
|-- myapp-web.conf
|-- myapp.conf
Run Code Online (Sandbox Code Playgroud)
他们的内容是:
myapp.conf
pre-start script
bash << "EOF"
mkdir -p /var/log/myapp
chown -R deployer /var/log/myapp
EOF
end script
Run Code Online (Sandbox Code Playgroud)
MYAPP-web.conf
start on starting myapp
stop on stopping myapp
Run Code Online (Sandbox Code Playgroud)
myapp-web-1.conf/myapp-web-2.conf/myapp-web-3.conf
start on starting myapp-web
stop on stopping myapp-web
respawn
exec su - deployer -c 'cd /var/applications/releases/20110607140607; cd myapp && bundle …
Run Code Online (Sandbox Code Playgroud) 我正在研究用Python编写的某种系统服务(实际上它只是一个日志解析器).这个程序应该连续工作很长时间(希望我的意思是几天和几周没有失败和重新启动的需要).这就是为什么我担心内存消耗.
我将来自不同站点的进程内存使用情况的不同信息汇总到一个简单的函数中:
#!/usr/bin/env python
from pprint import pprint
from guppy import hpy
from datetime import datetime
import sys
import os
import resource
import re
def debug_memory_leak():
#Getting virtual memory size
pid = os.getpid()
with open(os.path.join("/proc", str(pid), "status")) as f:
lines = f.readlines()
_vmsize = [l for l in lines if l.startswith("VmSize")][0]
vmsize = int(_vmsize.split()[1])
#Getting physical memory size
pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
#Analyzing the dynamical memory segment - total number of objects in memory and heap size
h = hpy().heap()
if …
Run Code Online (Sandbox Code Playgroud) 我的服务器托管限制了1GB内存.当我想编译一些大型程序时git-annex
,Cabal吃了很多内存.有没有办法限制cabal
或gcl
使用某些选项来限制内存使用?
我用一些细节更新了问题:我在Webfaction托管(CentOS 7 - 64bit)上运行cabal
(1.22.4.0)和Ghc
7.10.2,可以访问shell(非root访问).Webfaction admin/robot通常会因编译而容忍一些爆发.但Ghc
/ Cabal
需要太多内存并花费太多时间来进行某些包编译.因此系统会自动杀死所有进程.
我需要多次重新启动编译才能最终获得成功的结果.
我的主要目标是编译以成功结束,无论需要多长时间.
我正在寻找在我的应用程序中减少SQLite3的内存消耗的方法.
在每次执行时,它都会创建具有以下模式的表:
(main TEXT NOT NULL PRIMARY KEY UNIQUE,count INTEGER DEFAULT 0)
Run Code Online (Sandbox Code Playgroud)
之后,数据库每秒充满50k操作.只写.
当一个项目已经存在时,它会使用更新查询更新"count"(我认为这称为UPSERT).这些是我的疑问:
INSERT OR IGNORE INTO table (main) VALUES (@SEQ);
UPDATE tables SET count=count+1 WHERE main = @SEQ;
Run Code Online (Sandbox Code Playgroud)
这样,每个事务有500万次操作,我可以非常快速地写入数据库.
我真的不关心这个问题的磁盘空间,但我有一个非常约束的RAM空间.因此,我不能浪费太多记忆.
使用sqlite3_user_memory()通知其执行期间内存消耗增长到近3GB.如果我通过sqlite3_soft_heap_limit64()将其限制为2GB,则当达到2GB时,数据库操作性能几乎降至零.
我不得不将缓存大小提高到1M(默认页面大小)以达到理想的性能.
我该怎么做才能减少内存消耗?
我正在对我的数据库进行压力测试,该数据库托管在运行在具有10 GB RAM的64位计算机上的64位SQL Server 2008上.
我有400个线程.每个线程每秒查询一次数据库,但查询时间不需要花费时间,正如SQL分析器所说的那样,但是18小时后SQL Server使用了7.2 GB的RAM和7.2 GB的虚拟内存.
这是正常的行为吗?如何调整SQL Server以清理未使用的内存?
我正在使用反射来绘制对象.这些对象在托管代码中,但除了通过反射之外,我无法看到它们的源代码,底层结构等.所有这一切的首要目标是对象的基本内存映射(类似于SOS.dll DumpObject
和!ObjSize
命令的功能).因此,我试图确定哪些成员被"重复计算"为一个字段和一个属性.
例如:
public class CalendarEntry
{
// private property
private DateTime date { get; set;}
// public field
public string day = "DAY";
}
Run Code Online (Sandbox Code Playgroud)
映射时显示:
像这样的一个类:
public class CalendarEntry
{
// private field
private DateTime date;
// public field
public string day = "DAY";
// Public property exposes date field safely.
public DateTime Date
{
get
{
return date;
}
set
{
date = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
映射时显示:
任何人都可以详细分析namenode的内存消耗吗?还是有一些参考资料?在网络中找不到资料.谢谢!
linux ×2
performance ×2
c ×1
c# ×1
cabal ×1
field ×1
ghc ×1
go ×1
hadoop ×1
haskell ×1
java ×1
limit ×1
logging ×1
process ×1
properties ×1
python ×1
readability ×1
reflection ×1
sql-server ×1
sqlite ×1
upstart ×1