街上的字是scala中的循环比while循环慢.
慢:
for (i <- 0 until 10000) {
f(i)
}
Run Code Online (Sandbox Code Playgroud)
快速:
var i = 0
while (i < 10000) {
f(i)
i += 1
}
Run Code Online (Sandbox Code Playgroud)
如何使用hprof来判断for循环是否是我代码中的瓶颈?我正在使用的代码进行分析-agentlib:hprof=cpu=samples
,该方法在"CPU SAMPLES"部分中会是什么?
我想知道在哪里集中我的优化工作.for循环是瓶颈吗?
我不时会在Android Studio中使用Memory Monitor和HPROF Viewer来检查是否存在任何内存泄漏和内存使用情况.
我相信我知道查看器中使用的大多数符号和颜色的含义,但我想确定并且不仅仅是对它们有自己的理解.我没有在网上找到任何解释,但我确信我的问题的答案非常简单.
参考文献3中的下列符号是什么意思?
当实例的字体颜色为蓝色,红色,粗体或斜体时,这意味着什么?
有时符号1,2和3可以在同一实例中组合.这是否意味着特别的东西?
当悬停不同的图标时,我对HPROF Viewer的功能请求是一个工具提示.
我已经使用了多线程程序的基准测试,-agentlib:hprof=cpu=samples
并且惊讶地发现结果中有以下行:
rank self accum count trace method
1 52.88% 52.88% 8486 300050 java.lang.Object.hashCode
Run Code Online (Sandbox Code Playgroud)
我从未在程序中显式调用hashCode().这可能是什么原因?我如何理解这次"浪费"的来源以及它是否正常?
谢谢,大卫
正如许多有用网站所详述的,分析Android应用程序内存使用情况的一种方法是执行"kill -10 [PID]"来触发HPROF转储.这似乎适用于某些设备,logcat通常包含以下内容:
I/dalvikvm(32170): threadid=3: reacting to signal 10
I/dalvikvm(32170): SIGUSR1 forcing GC and HPROF dump
I/dalvikvm(32170): hprof: dumping VM heap to "/data/misc/heap-dump-tm1302633572-pid32170.hprof-hptemp".
I/dalvikvm(32170): hprof: dumping heap strings to "/data/misc/heap-dump-tm1302633572- pid32170.hprof".
I/dalvikvm(32170): hprof: heap dump completed, temp file removed
Run Code Online (Sandbox Code Playgroud)
但是,在其他设备上,执行"kill -10"会导致:
I/dalvikvm( 5687): threadid=4: reacting to signal 10
I/dalvikvm( 5687): SIGUSR1 forcing GC (no HPROF)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用的所有设备都是root用户,我确保将chmod/data/misc设置为777.执行"kill -10"后,我没有收到任何错误消息.
如果它有用,这里是我获得HPROF转储的设备:HTC ACE(Desire HD),HTC G1,HTC Nexus One(T-Mobile)
以下是我没有获得HPROF转储的设备:Nexus S,Droid,Droid X,Nexus One(AT&T)
为什么我不能从某些设备获得HPROF转储,是否有什么可以让我获得转储?
我希望我的java在捕获时退出OutOfMemoryError
,我正在使用-XX:+HeapDumpOnOutOfMemoryError
转储hprof
文件.
我无法使用,kill -9 <pid>
因为在转储hprof
文件时JVM需要启动,有没有办法在hprof
创建文件后停止JVM ?
要清楚我正在使用Sun的JVM版本6.
我使用的是 jdk64,我的 java 版本是“1.6.0_24”。我的 tomcat 使用 -Xmx7196m 运行,而 jvisualvm 使用 -J-Xms2048m -J-Xmx3072m 运行。我对我的 tomcat java 进程进行了堆转储,我的.hprof
文件大小约为 5.5 GB。当我尝试打开这个堆转储时,它只是停留在Loading Heap Dump...
屏幕上。
我还查看了 VisualVM 在尝试打开堆转储时的堆消耗情况,但只有 500MB 左右。
注意:我确实看过jvisualvm: Stuck on “Loading Heap Dump” screen question 但它是不同的并且没有解决我的问题。
我有一个应用服务器堆转储 (hprof) 的实例。如何使用 visualvm 或任何其他工具检查泄漏的文件描述符?
我确实通过运行检查了正在使用的文件描述符
sudo lsof | grep java | wc -l
Run Code Online (Sandbox Code Playgroud)
当我运行以下 OOQL 时,我会得到一个 FileDescriptors 列表
select x from java.io.FileDescriptor x
Run Code Online (Sandbox Code Playgroud)
但是如何使用堆转储分析来查找滥用类?
我是Android开发的新手.我想分析我的应用程序使用内存的方式.我正在使用Android Studio 2.1.3开发我的应用程序.
我正在使用Android Monitor观察内存消息,我正在尝试创建一个"hprof"文件.我点击内存监视器中的"Dump Java Heap"按钮,但没有任何反应.
在以下链接中,官方文档指出HPROF Viewer会在创建hprof文件后自动显示. 官方文档截图
官方文档还指出转储文件存储在Heap Snapshot文件夹中,以便以后查看.
我找不到存储转储文件的文件夹.
我甚至在我的所有硬盘上搜索了带有"hprof"扩展名的文件,什么都没发现.
你能帮我找到转储文件并打开它吗?
hprof ×10
java ×5
android ×3
heap-dump ×2
profiling ×2
benchmarking ×1
hashcode ×1
heap-memory ×1
jvisualvm ×1
jvm ×1
optimization ×1
scala ×1
sun ×1
visualvm ×1