如何在Java中将字节大小转换为人类可读的格式?像1024应该变成"1 Kb"而1024*1024应该变成"1 Mb".
我有点厌倦为每个项目编写这个实用工具方法.Apache Commons中是否有任何静态方法?
是否有任何API可以让我们获得android的CPU或内存使用?
我试过一个代码如下:
package com.infostretch.mainactivity;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class CPULoad
{
long total = 0;
long idle = 0;
float usage = 0;
public CPULoad()
{
readUsage();
}
public float getUsage()
{
readUsage();
return usage;
}
private void readUsage()
{
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/stat")), 1000);
String load = reader.readLine();
reader.close();
String[] toks = load.split(" ");
long currTotal = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4]);
long currIdle = Long.parseLong(toks[5]);
this.usage = (currTotal …
Run Code Online (Sandbox Code Playgroud) 是否可以通过Android SDK获取Android设备(而非SD卡)上的可用内存量?
如果是这样,怎么样?
我想获得一个设备的完整RAM大小.memoryInfo.getTotalPss()
返回0.没有获取总RAM大小的函数ActivityManager.MemoryInfo
.
这该怎么做?
在过去几年中,为了检查Android上的堆内存量以及使用量,可以使用以下内容:
@JvmStatic
fun getHeapMemStats(context: Context): String {
val runtime = Runtime.getRuntime()
val maxMemInBytes = runtime.maxMemory()
val availableMemInBytes = runtime.maxMemory() - (runtime.totalMemory() - runtime.freeMemory())
val usedMemInBytes = maxMemInBytes - availableMemInBytes
val usedMemInPercentage = usedMemInBytes * 100 / maxMemInBytes
return "used: " + Formatter.formatShortFileSize(context, usedMemInBytes) + " / " +
Formatter.formatShortFileSize(context, maxMemInBytes) + " (" + usedMemInPercentage + "%)"
}
Run Code Online (Sandbox Code Playgroud)
这意味着,您使用的内存越多,特别是通过将位图存储到内存中,您就可以越接近允许应用程序使用的最大堆内存.当您达到最大值时,您的应用程序将因OutOfMemory异常(OOM)而崩溃.
我注意到在Android O上(在我的情况下是8.1,但它也可能在8.0上),上面的代码不受Bitmap分配的影响.
进一步深入,我注意到在Android分析器中你使用的内存越多(在我的POC中保存大位图),使用的本机内存就越多.
为了测试它是如何工作的,我创建了一个简单的循环:
val list = ArrayList<Bitmap>()
Log.d("AppLog", "memStats:" + MemHelper.getHeapMemStats(this))
useMoreMemoryButton.setOnClickListener {
AsyncTask.execute {
for (i in …
Run Code Online (Sandbox Code Playgroud) 我正在写一个图片库应用程序,我一直遇到内存不足错误.我缓存了所有图像,但是当我尝试快速切换图像时会出现问题.我假设应用程序分配的内存比GC有时间释放它们更快(因为当我慢慢切换图像时不会发生崩溃).
在对这个问题进行了几天的敲击之后,我终于决定尝试在清单文件中给出largeHeap设置.在此设置之后,无论我在图像之间切换多快,我的应用程序都不会崩溃.
现在,我想知道是否存在使用largeHeap设置的任何约定或一般准则,因为如果使用注释应用程序使用largeHeap可能没有多大意义.一般来说,哪些应用程序适合largeHeap设置?
谢谢
我正在尝试获取总内存 (RAM) 和内部存储大小,但我使用的每种方法都报告它太低。我知道内核可能会占用其中的一些,但我需要知道总共安装了多少。
对于内存,我首先从 /proc/meminfo/ 读取,然后使用getMemoryInfo
. 每个报告都小于安装的内存量(700MB 而不是 1GB)。
对于我使用的内部存储大小Environment.getDataDirectory
,getBlockSizeLong
和getBlockCountLong
. 这样做的结果远低于我所知道的已安装的存储量。操作系统中的设置与我的方法报告的数量一致,但我需要知道安装的总量,而不仅仅是它认为的数量(即使我输入它在我脑海中听起来违反直觉)。
编辑:正如我所说,我已经查看了正在发送的问题并尝试了他们的方法。与我所知道的安装情况相比,报告的值不正确。
我想从我的Android手机中收集一些统计数据.
当我开始我的应用程序时,我想知道以下内容:
我必须做些什么来收集统计信息,可能会写一些代码,或者你可能会使用一些提供这些信息的应用程序或其他东西.我使用MAT,但它对我没有帮助,也许我想念一些东西.
我想收集这些统计数据的主要原因是,应用程序可能会开始杀死其他应用程序以释放更多空间,如果我可以收集此类信息,我将了解所有内容.
例如我的应用程序使用大小为85 MB的库(helper.jar),我知道如果应用程序使用.jar它加载到手机的RAM,现在我怎么看到我的RAM从2增加到2 + 85(大小.jar).
如果我从ADB 键入adb shell cat/proc/meminfo此命令,我将看到有关内存的一些信息.
我如何从JAVA代码中做到这一点?
最诚挚的问候,ViTo Brothers.
有什么办法,如何确定Android应用程序中的实际分配内存(代码中)?
谢谢
航点
我有一个SyncAdapter,它在初始入门过程(登录/注册)期间被调用,该过程处理联系人以查找已经使用该系统的用户联系人.
当SyncAdapter运行时,应用程序在特定设备(Moto G)上几乎每次都被杀死(10次中有9次).
我最初的想法是,由于设备的可用RAM有限,应用程序正在被杀死.所以,我试着证实这个理论:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) getContext()
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
Log.d(TAG, "Available: " + availableMegs);
Log.d(TAG, "Low Memory: " + mi.lowMemory);
}
Run Code Online (Sandbox Code Playgroud)
事实证明RAM可能不是问题,因为日志看起来像这样:
03-09 11:38:34.444 19193-21339/mypackage.sandbox D/SyncAdapter: Available: 252
03-09 11:38:34.445 19193-21339/mypackage.sandbox D/SyncAdapter: Low Memory: false
Run Code Online (Sandbox Code Playgroud)
在日志中我发现了这个:
03-09 11:38:35.233 865-1610/? I/ActivityManager: Killing 19193:mypackage.sandbox/u0a579 (adj 0): depends on provider …
Run Code Online (Sandbox Code Playgroud) AFAIK android根据OEM
设备及其RAM
自身的屏幕分辨率分配堆限制.例如:三星s5 128mb是限制.
如何在Android中获取当前的内存使用量?
而Android Profiler显示我的应用程序吃的内存超过> 128.
内存不足
Line 160185: 12-08 11:22:18.332 I/art (11728): Alloc partial concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 0% free, 127MB/128MB, paused 2.012ms total 240.841ms
Line 160325: 12-08 11:22:18.652 I/art (11728): Clamp target GC heap from 143MB to 128MB
Line 160327: 12-08 11:22:18.652 I/art (11728): Alloc concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 0% free, 127MB/128MB, paused 2.378ms total 314.229ms
Line 160675: 12-08 …
Run Code Online (Sandbox Code Playgroud) 朋友们在做什么,希望最好.朋友,我想知道我的Android设备有多少内存,以及有多少内存使用活动内存,非活动内存,可用内存和MB中的有线内存我已经通过此链接通过解析"/ system/bin/cat","/ proc/meminfo"我们可以得到上面提到的东西,是的,我得到所有的东西,但我得到一个长串我拥有一切
MemTotal: 377192 kB
MemFree: 10448 kB
Buffers: 1368 kB``
Cached: 74276 kB
SwapCached: 0 kB
Active: 143116 kB
Inactive: 177292 kB
Active(anon): 118388 kB
Inactive(anon): 137664 kB
Active(file): 24728 kB
Inactive(file): 39628 kB
Unevictable: 10664 kB
Mlocked: 10372 kB
HighTotal: 190464 kB
HighFree: 568 kB
LowTotal: 186728 kB
LowFree: 9880 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 255440 kB
Mapped: 45816 kB
Shmem: 624 kB
Slab: 10952 kB …
Run Code Online (Sandbox Code Playgroud) 在我们进入的设备中Manage apps
- > running tab
然后在底部我们看到使用的内存和可用内存实时改变它们的值.
我们如何将其编码到我的应用程序以显示相同的统计信息?
谢谢