我正在创建一个计划执行程序来读取JVM的内存使用情况.我有两种方法可以在正在运行的JVM中获取内存统计信息 - Runtime和MemoryMXBean,它们的方法之间有以下对应关系:
memoryMxBean.getHeapMemoryUsage().getUsed() <=> runtime.totalMemory() - runtime.freeMemory()
memoryMxBean.getHeapMemoryUsage().getCommitted() <=> runtime.totalMemory()
memoryMxBean.getHeapMemoryUsage().getMax() <=> runtime.maxMemory()
Run Code Online (Sandbox Code Playgroud)
除了MemoryMXBean提供的额外非堆内存使用信息之外,有什么理由可以让我更喜欢它而不是运行时,反之亦然?
我有一个表"课",它与表"学生"和"老师"相关联.通过外围关键关系将"班级"与多个学生和教师联系起来.
当我使用hibernate关联并获取大量实体(尝试5000)时,我发现它占用的内存比使用外键占位符的内存多4倍.hibernate关联有什么问题吗?
我可以使用任何内存分析器来找出使用太多内存的内容吗?
这是架构的方式:
class(id,className)
student(id,studentName,class_id)
teacher(id,teacherName,class_id)
class_id is foreign key..
Run Code Online (Sandbox Code Playgroud)
案例#1 - Hibernate协会
1)在班级实体中,将学生和教师映射为:
@Entity
@Table(name="class")
public class Class {
private Integer id;
private String className;
private Set<Student> students = new HashSet<Student>();
private Set<Teacher> teachers = new HashSet<Teacher>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "classRef")
@Cascade({ CascadeType.ALL })
@Fetch(FetchMode.SELECT)
@BatchSize(size=500)
public Set<Student> getStudents() {
return students;
}
Run Code Online (Sandbox Code Playgroud)
2)在学生和老师中,映射类为:
@Entity
@Table(name="student")
public class Student {
private Integer id;
private String studentName;
private Class classRef;
@ManyToOne
@JoinColumn(name = "class_id")
public Class getClassRef() …Run Code Online (Sandbox Code Playgroud) 我正在与Pympler进行一些完整性检查,以确保在我尝试分析实际脚本时我理解结果,但我对结果感到有些困惑.以下是我尝试的健全性检查:
SANITY CHECK 1:我启动Python(3)控制台并执行以下操作:
from pympler import summary, muppy
sum = summary.summarize(muppy.get_objects())
summary.print_(sum)
Run Code Online (Sandbox Code Playgroud)
这导致以下总结:
types | # objects | total size
==================================== | =========== | ============
<class 'str | 16047 | 1.71 MB
<class 'dict | 2074 | 1.59 MB
<class 'type | 678 | 678.27 KB
<class 'code | 4789 | 673.68 KB
<class 'set | 464 | 211.00 KB
<class 'list | 1319 | 147.16 KB
<class 'tuple | 1810 | 120.03 KB
<class 'weakref | 1269 | …Run Code Online (Sandbox Code Playgroud) 有没有办法在Python中分析多线程程序的内存?
对于CPU分析,我使用cProfile为每个线程创建单独的分析器统计信息,然后将它们组合起来.但是,我找不到使用内存分析器执行此操作的方法.我正在使用heapy.
有没有办法像cProfile一样整合大量的统计数据?或者你会建议哪些内存分析器更适合这项任务.
有人提出了一个相关问题,要求分析多线程程序的CPU使用情况:如何在Python中分析多线程程序?
关于内存分析器的另一个问题是:Python内存分析器
这实际上是这个问题的后续问题.我设法让分析工作,问题似乎真的是懒惰的评价.
我正在使用的数据结构是a Map Int (Map Int Text),其中Text来自Data.Text.问题是,构建此映射的函数会产生巨大的影响.处理大约3 MB的输入文本时,程序需要超过250 MB的内存.
现在来看这个问题的真正目的:
要获取此数据结构中的字符数,请使用以下函数:
type TextResource = M.Map Int (M.Map Int T.Text)
totalSize :: TextResouce -> Int
totalSize = M.fold ((+) . (M.fold ((+). T.length) 0)) 0
Run Code Online (Sandbox Code Playgroud)
不漂亮,但它完成了工作.我在创建TextResource后立即在main函数中使用此函数.有趣的是,当我使用RTS选项配置程序时,-hr或者-hc内存使用量在一段时间后降至70或50 MB,这将是完全正常的.
不幸的是,这仅在使用性能分析选项和totalSize功能时才有效- 没有它们它会回到250 MB.
我将程序(<70行)与测试文件和cabal文件一起上传,以便您可以自己尝试:链接
test.xml是生成的XML文件,应放入executables目录中.要构建,cabal configure --enable-executable-profiling之后cabal build应该足够了(如果你安装了所需库的分析版本).
您可以在运行程序时看到更改一次,+RTS -hc一次运行没有.
如果有人可以运行这个程序,我真的很棒,因为我真的被困在这里.我已经尝试过deepseq几个地方,但没有任何作用(好吧,除了使用分析选项).
编辑:
然而,分析确实表明只使用了大约20MB的堆,因此在我的评论中,我责怪GHC没有像你想要的那样释放尽可能多的GC托儿所内存.
谢谢,这指出了我正确的方向.事实证明,你可以告诉GHC执行垃圾收集(performGC),在深度调整地图后,它可以很好地工作.虽然我猜不推荐使用performGC,但这似乎是适合这项工作的正确工具.
Edit2: 这是我改变main函数的方法(+ deepseqing返回buildTextFile):
main = do …Run Code Online (Sandbox Code Playgroud) 在一个复杂的多线程应用程序中,我每周会遇到一次内存不足异常.应用程序通过多个套接字发送/读取大量数据,其中读取数据被缓存以避免网卡缓冲区溢出.
分析内存异常的最佳策略是什么?在正常运行时,应用程序在Process Explorer中显示的大小为"所有堆中的总字节数",最大为1.5 GB.
拥有一个轮询的策略也是一种策略
GC.GetTotalMemory()
要么
PrivateMemorySize64()
一秒钟知道何时开始分析事物?我还没有考虑商业剖析器,我有点担心它们对性能的影响,这可能会给实际问题分析带来错误的结果.
当我们尝试在ie11的内存分析器(Windows 10)中获取内存快照时,我们会遇到内存不足异常.
有没有办法告诉ie开发工具使用更多内存?我们的计算机有比所需更多的内存.
有没有办法找到多少尺寸的状态(对象,数组等)或组件的内存占用。
在我当前的上下文中,我需要知道特定状态/组件是否非常重(就内存而言)。
在 chrome 中,我已经尝试过对内存进行快照,但是在这样的大信息中,我找不到如何在结果中识别特定组件或状态:
memory-management memory-profiling vue.js vuex vue-profiling
我一直在尝试使用龙卷风Redis的(这基本上是一个叉brükva略作修改与tornado.gen接口而不是adisp工作),以便通过使用提供事件的Redis'发布订阅.
所以我写了一个小脚本来测试这个例子的灵感.
import os
from tornado import ioloop, gen
import tornadoredis
print os.getpid()
def on_message(msg):
print msg
@gen.engine
def listen():
c = tornadoredis.Client()
c.connect()
yield gen.Task(c.subscribe, 'channel')
c.listen(on_message)
listen()
ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我PUBLISH通过redis-cli内存使用率不断上升时.
为了描述内存使用情况,我首先尝试使用guppy-pe,但它不能在python 2.7下运行(是的,甚至尝试过后备箱),所以我又回到了pympler.
import os
from pympler import tracker
from tornado import ioloop, gen
import tornadoredis
print os.getpid()
class MessageHandler(object):
def __init__(self):
self.memory_tracker = tracker.SummaryTracker()
def on_message(self, msg):
self.memory_tracker.print_diff()
@gen.engine
def listen():
c = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用分析来查看我的代码的哪一部分负责最大使用 3GB 内存(如gc()最大使用内存统计报告所示,请参阅此处如何)。我正在运行这样的内存分析:
Rprof(line.profiling = TRUE, memory.profiling = TRUE)
graf(...) # ... here I run the profiled code
Rprof(NULL)
summaryRprof(lines = "both", memory = "both")
Run Code Online (Sandbox Code Playgroud)
输出如下:
$by.total
total.time total.pct mem.total self.time self.pct
"graf" 299.12 99.69 50814.4 0.02 0.01
#2 299.12 99.69 50814.4 0.00 0.00
"graf.fit.laplace" 299.06 99.67 50787.2 0.00 0.00
"doTryCatch" 103.42 34.47 4339.2 0.00 0.00
"chol" 103.42 34.47 4339.2 0.00 0.00
"tryCatch" 103.42 34.47 4339.2 0.00 0.00
"tryCatchList" 103.42 34.47 4339.2 0.00 0.00
"tryCatchOne" 103.42 …Run Code Online (Sandbox Code Playgroud) memory-profiling ×10
python ×3
java ×2
memory-leaks ×2
c# ×1
haskell ×1
hibernate ×1
one-to-many ×1
profiling ×1
python-3.x ×1
r ×1
redis ×1
tornado ×1
vue.js ×1
vuex ×1