内存不足异常 + 分析 hprof 文件转储

2023-11-26

这与这个问题有关:

android.graphics.BitmapFactory.nativeDecodeAsset(本机方法)处的 java.lang.OutOfMemoryError

我创建了相关转储文件,它提供了以下信息:

One instance of "byte[]" loaded by "<system class loader>" occupies 1,10,59,216
(51.02%) bytes. The memory is accumulated in one instance of "byte[]" 
 loaded by "<system class loader>".

Keywords byte[]

那么现在可以做什么呢?我该如何清除问题?

我的 list_objects[context]-入站文件:

CLASS NAME                                                                 SHALLOW HEAP   RETAINED HEAP  
byte[11059200] @ 0xb4979590                                               |  1,10,59,216 |   1,10,59,216
mBuffer android.graphics.Bitmap @ 0xb3dc68d8                              |48            | 48
mBitmap android.graphics.drawable.BitmapDrawable @ 0xb3dbba60             | 72           | 144
mBackground android.widget.RelativeLayout @ 0xb3db3fc0                    |512           | 10,144
mBitmap android.graphics.drawable.BitmapDrawable$BitmapState @ 0xb3dc0068 |40          | 40
mBitmapState android.graphics.drawable.BitmapDrawable @ 0xb3dbba60        |72          |  144
referent java.lang.ref.WeakReference @ 0xb3dc2d68                         |24          |  24

如何解决内存问题?

我的 home_screen.java

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_page);
    main();
 private void main() {
    // TODO Auto-generated method stub
    
    
    final Button home;
    final Button aboutus;
    final Button contacts;
    final Button clients;
    final Button services;
    
    try
    {

    home = (Button)findViewById(R.id.btnHome);
    aboutus = (Button)findViewById(R.id.btnAboutus);
    clients = (Button)findViewById(R.id.btnClients);
    contacts = (Button)findViewById(R.id.btnContacts);
    services = (Button)findViewById(R.id.btnServices);
    
    home.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.home1);
            Drawable d = new BitmapDrawable(getResources(),b);              
            home.setBackgroundDrawable(d);
            System.gc();
            Intent myIntent = new Intent(Home_Screen.this, Button_Anime.class);
            startActivity(myIntent);
        }
    });
    aboutus.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.about1 );
            Drawable d = new BitmapDrawable(getResources(),b); 
            aboutus.setBackgroundDrawable(d);
            Intent myIntent = new Intent(Home_Screen.this, AboutUs.class);
            startActivity(myIntent);
        }
    });
    clients.setOnClickListener(new  OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            
            Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.clients1 );
            Drawable d = new BitmapDrawable(getResources(),b); 
            clients.setBackgroundDrawable(d);
            Intent myIntent = new Intent(Home_Screen.this, Clients.class);
            startActivity(myIntent);
        }
    });
    contacts.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            
            Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.contact1);
            Drawable d = new BitmapDrawable(getResources(),b);
            contacts.setBackgroundDrawable(d);
            Intent myIntent = new Intent(Home_Screen.this, Contacts.class);
            startActivity(myIntent);
        }
    });
    services.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            
            Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.services1 );
            Drawable d = new BitmapDrawable(getResources(),b);
            services.setBackgroundDrawable(d);
            Intent myIntent = new Intent(Home_Screen.this, Services.class);
            startActivity(myIntent);
        }
    });

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

这个想法是对图像进行下采样,以便它在较小的屏幕上看起来不错,并且您不必将整个位图加载到内存中。

1)首先获取要显示的 ImageView/屏幕的大小。

2)通过传入读取Bitmap的大小BitmapFactory.Options.inJustDecodeBounds。这将为您提供位图的大小,而不是加载整个位图。

3) 获取样本大小。计算屏幕的高度和宽度与图像高度和宽度的比率。使用最小的尺寸,这样最大的尺寸看起来就很好。

4)最后使用下面的函数来获得不会占用内存的下采样图像。

2)(code)

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, bitmapOptions);
int imageWidth = bitmapOptions.outWidth;
int imageHeight = bitmapOptions.outHeight;
inputStream.close();

4)(code)

private Bitmap downscaleBitmapUsingDensities(final int sampleSize,final int imageResId)
  {
  final Options bitmapOptions=new Options();
  bitmapOptions.inDensity=sampleSize;
  bitmapOptions.inTargetDensity=1;
  final Bitmap scaledBitmap=BitmapFactory.decodeResource(getResources(),imageResId,bitmapOptions);
  scaledBitmap.setDensity(Bitmap.DENSITY_NONE);
  return scaledBitmap;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存不足异常 + 分析 hprof 文件转储 的相关文章

随机推荐

  • 在scrapy中抓取后发送电子邮件

    pipeline py代码 class Examplepipeline object def init self dispatcher connect self spider opened signal signals spider ope
  • 是否可以使用 Linkedin Api 获取所有 Linkedin 个人资料帖子

    我正在尝试使用 linkedin API 来显示我的个人资料的提要 我从第一天开始就发布了这些内容 帖子包括媒体 图像 视频等 我想知道是否有可用的 Api 我可以在其中传递一些参数并获取我的 linkedin 个人资料的所有帖子 如果有人
  • 是否有必要在 return 语句中使用 std::move ,并且应该返回右值引用吗?

    我试图理解 C 11 的右值引用和移动语义 这些示例之间有什么区别 哪些示例不进行矢量复制 第一个例子 std vector
  • 如何在控制器中不使用 Rails 操作参数

    我正在 Rails 服务器中为 Shipworks 实现第三方 API 并且 Shipworks 客户端应用程序正在发布action具有 Shipworks 特定语义的参数 然而 Rails 路由逻辑会将此参数覆盖为控制器方法的名称 我是否
  • 如何更新 pandas 中的现有数据框?

    给定这两个数据框 gt gt gt df1 pd DataFrame c1 a a b b c2 x y x y val 0 gt gt gt df1 c1 c2 val 0 a x 0 1 a y 0 2 b x 0 3 b y 0 gt
  • Unity3D,从Unity.UI面板构建PNG?

    考虑任何 Unity UICanvas你可能有 想象一个典型的Panel在那张画布上 假设它恰好包含一些图像 也许一些文本等等 如果您可以将该面板 仅面板 转换为屏幕截图 Texture2D 或 PNG 那将非常方便 我唯一能想到的就是使用
  • 更改 Forge 中的材料

    目前 我们正在让客户端在页面加载时检索对象状态 这将导致模型中的 待处理 对象变成不同的颜色 然后我们轮询更改以更新着色 首先 当查看器加载时 挂起的对象会着色 然后我们继续轮询以再次检查和更改状态 以使 Forge 以不同的颜色渲染它们并
  • 编辑QTableView单元格后如何更改背景颜色?

    我有这个带有自定义模型和委托的 QTableView 编辑后如何更改单元格的背景颜色 我应该在代表处这样做吗setModelData index model setData index QVariant True Qt UserRole 然
  • 将 ActionBar 主页按钮设置在右侧

    我可以将 ActionBar 中的主页按钮设置在右侧吗 android R id home 我想更改主页按钮的位置 因为该语言使用从右到左的打字方式 是否可以 如果是 请告诉我该怎么做 如果没有 如何将 ActionBarDrawerTog
  • Python 会在赋值时创建对象的副本吗?

    当我尝试这段代码时 dict a dict b dict c dict c hello goodbye print dict a print dict b print dict c 我预计它只会初始化dict a dict b and di
  • 媒体播放器、打瞌睡模式、唤醒锁和前台服务

    我读过几篇关于 Android M 中新的 打瞌睡 模式的文章 还有 Android 开发者网站上的文章 https developer android com training monitoring device state doze s
  • PHP正则表达式用于强密码验证[重复]

    这个问题在这里已经有答案了 我在网上看到过以下正则表达式 8 d W n A Z a z 仅当字符串满足以下条件时才验证 contain at least 1 upper case letter contain at least 1 low
  • Github级联合并的做法是怎样的?

    github上是否有任何选项或实践可以提供像bitbucket这样的自动PR级联 https confluence atlassian com bitbucketserver automatic branch merging 7766399
  • ES6 Arrow 函数正在改变 Meteor.publish 中的 this 范围 [重复]

    这个问题在这里已经有答案了 所以我开始使用ES6Meteor 但显然如果你尝试使用Meteor publish带有箭头函数的语法 this userId是未定义的 而如果你将它与常规一起使用function this userId工作完美
  • C++ 中对象的静态和动态内存分配

    在C 程序中 对于一个类 如何获取任意时刻静态创建和动态创建的活动对象的数量 可悲的是你不能 斯科特 迈耶 Scott Meyer 的一本书中有整整一个章节 他继续讲述试图实现这一目标的挑战 但缺点是这是不可能的 更有效的 C 第 27 条
  • 当用户终止应用程序时,我可以进行 api 调用吗?

    当用户终止应用程序 强制关闭 时 我需要进行 API 调用 我所做的直接实施如下 在应用程序委托中 我添加了以下代码 func applicationWillTerminate application UIApplication print
  • 如何在 ASP.Net MVC 中使用 PdfSharp 显示 PDF?

    我们正在制作一个 ASP Net MVC 应用程序 它需要能够生成 PDF 并将其显示到屏幕上或将其保存在用户易于访问的位置 我们使用 PdfSharp 生成文档 完成后 我们如何让用户保存文档或在阅读器中打开它 我特别困惑 因为 PDF
  • 如何对使用会话窗口的 kafka 流应用程序进行单元测试

    我正在使用 Kafka Stream 2 1 我正在尝试为聚合的流应用程序编写一些测试 一些事件按其键 即通过相关 ID 使用会话窗口 不活动间隙为 300 毫秒 这是由方法表示的聚合实现 private static final int
  • 从android中的周数和年份获取周开始和结束日期

    我希望获取传递给该方法的周数的一周开始日期和结束日期 例如 如果我将周数传递为51和年份2011 它应该返回我的开始日期18 Dec 2011结束日期为24 Dec 2011 有什么方法可以帮助我实现这一目标吗 您可以使用以下方法获取一周的
  • 内存不足异常 + 分析 hprof 文件转储

    这与这个问题有关 android graphics BitmapFactory nativeDecodeAsset 本机方法 处的 java lang OutOfMemoryError 我创建了相关转储文件 它提供了以下信息 One ins