我正在开发一个Android应用程序.该应用程序有一个包含大量图像的视图.我有一个错误,我会尝试提供尽可能多的信息,希望有人可以给我一些建议.
该应用程序在所有本地测试中都运行良好.但是,我收到了很多来自用户的崩溃:java.lang.OutOfMemoryError: bitmap size exceeds VM budget
这是堆栈跟踪
0 java.lang.OutOfMemoryError: bitmap size exceeds VM budget
1 at android.graphics.Bitmap.nativeCreate(Native Method)
2 at android.graphics.Bitmap.createBitmap(Bitmap.java:507)
3 at android.graphics.Bitmap.createBitmap(Bitmap.java:474)
4 at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:379)
5 at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
6 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
7 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
8 at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:359)
9 at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:385)
Run Code Online (Sandbox Code Playgroud)
我最大的问题是,即使在旧设备上,我也无法在本地重现问题.
我已经实现了很多东西来尝试解决这个问题:
onDestroy()方法中的所有必要步骤inSampleSize.用于计算正确inSampleSize的代码
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
{
// Raw height and width of image
final int height = options.outHeight;
final …Run Code Online (Sandbox Code Playgroud) 我最近在启动应用程序时在Visual Studio 2005输出窗口中看到了这一行:
FTH:(7156):***应用于当前进程的容错堆填充程序.这通常是由于以前的崩溃造成的.***
我尝试使用以下说明关闭容错堆:http:
//msdn.microsoft.com/en-us/library/dd744764(VS.85).aspx
我正在运行Windows 7 64位版本,因此我对32位和64位注册表进行了更改,并使用32位和32位运行"Rundll32.exe fthsvc.dll,FthSysprepSpecialize"命令. 64位版本的Rundll32.exe.
但是,重新启动后,我仍然在尝试调试应用程序时获得容错堆!
这是一个真正的问题,因为它掩盖了我试图重现的错误,并且它也会杀死性能.
有没有人有任何其他建议如何禁用容错堆?
在蟒蛇有一个内置的heapq算法,让你push,pop,nlargest,nsmallest...等,你可以申请名单.但是,也有queue.PriorityQueue类似乎支持或多或少相同的功能.有什么区别,你何时会使用另一个?
可能重复:
堆栈和堆的内容和位置
我在堆栈和堆上有几个问题.
要知道的基本事情是堆栈比堆快,但是有限.(如我错了请纠正我).
但是,我总是想知道堆栈和堆是如何工作的.RAM只是一块内存,它不分为'堆栈'和'堆'(或者是它?).如果是这样,为什么我们首先将堆栈和堆中的内存分开?
操作系统可以让我们能够分配堆栈中的所有内容 - >一切都变得更快 - >幸福的世界?
我很确定事实并非如此.但为什么!?谁能给我一个深入的答案?
很抱歉,如果这篇帖子是某人发过的一些帖子的副本,那么有很多与堆栈和堆相关的帖子,我找不到我所拥有的确切问题.如果您碰巧知道一个,请继续并将其链接.
我已经读过 32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续的内存.有人可以解释"连续内存"的概念,以及为什么在Windows上只有1.5GB的最大值?
其次,64位Windows上的最大堆大小是什么,为什么这与32位可用的不同?
我的代码经常将C++字符串转换为CStrings,我想知道原始字符串是否在堆栈上分配,CString也会在堆栈上分配吗?例如:
string s = "Hello world";
char* s2 = s.c_str();
Run Code Online (Sandbox Code Playgroud)
会s2在堆栈上还是在堆中分配?换句话说,我需要删除s2吗?
相反,如果我有这个代码:
string s = new string("Hello, mr. heap...");
char* s2 = s.c_str();
Run Code Online (Sandbox Code Playgroud)
请问s2现在在堆中,因为它的起源是在堆上?
为了澄清,当我询问是否s2在堆上时,我知道指针在堆栈上.我问的是它指向堆或堆栈的内容.
我想在swift中不希望存储在堆栈/堆中的内容.我有一个很好的估计:你打印的所有东西和内存地址都不是值,它们存储在堆栈中,而是打印出的值是什么,它们在堆上,基本上根据值和引用类型.我完全错了吗?并且可选地,您是否可以提供堆栈/堆的可视化表示?
我正在研究不同类型的堆数据结构.
Fibonacci堆似乎具有更好的最坏情况复杂度(1)插入,(2)删除和(2)找到最小元素.
我发现在Java中有一个类PriorityQueue是平衡的二进制堆.但为什么他们不使用Fibonacci堆?
另外,是否有斐波那契堆的实现java.util?
谢谢!