I'm developing a large project with android technology
sometimes I have some exceptions like (Out Of Memory Error) on small devices
what I do when an exception occurred is to re-open the application
what happen that it leaves the previous process open and open a new process with new instance of application
I have tried to make
finish()
kill process
System.exit
to close the application and re-open it again but nothing works for me
any help please ???
First Thing you have to take care of, is Heap size.. You can track How much memory is getting consumed when your are running application. Under DDMS perspective there is a heap tab which will give you info about how much memory is consumed when you are running your application.
on what version of the android you are testing ? Android Os will allocate some memory for each application to run.In android 2.2 16mb will be allocated for one application. Version 2.3 allocates 24Mb for an application ,Android 3.0 allocates 42Mb. try testing on different versions of android, you will get to know..
Out of memory happens when RAM in a device is utilized fully, the system will throw this error and kill/restart the process. You need to find the appropriate place where you use the most of memory and handle the memory properly. Out of Memory generally happens because of poor bitmap/image handling. Check your code where you handle Bitmaps/ImageViews/PNG's etc.
Android default heap size is almost good for every heavy load jobs. Trace your code and find memory consuming parts of your code and try to optimize them. To do so, use HEAP tab in DDMS view in Eclipse.
yes that is the problem .i have faced similar problem recently then i resized my images then my problem is solved.Try to find out a way how to reduce the size of the images which you are loading from sever side back-end.
Related
I have been playing with optimizing my app, and I see that there are some general ideas on how much memory it should use... I'm running between 70-80Mb right now, is that a crazy number or just a little on the heavy side?
My second question is about the memory I am using. About 42Mb is taken up by graphics, whether I run the app with the layout graphics or run it without setting any views... any ideas on where to look? I feel like it is the theme, but I am not sure how to test that.
I've been searching for days to figure out why it uses so much and cannot figure it out. It remains constant regardless of which activity I am on, any ideas are welcome!
UPDATE:
I ended up running it on an emulator and got about 26Mb, more what I was expecting, but it runs at 70Mb with the 42Mb of graphics on the actual device.
The emulator allows for a 384Mb app after getting memoryclass information, while the device only allows 256Mb... the emulator has more storage and runs more efficiently.
The emulator is Android 8.1 27api while the device is Android 7.0 24api.
Tried on an older Android 5.1.1 api 22 below also.
Any ideas?
I have another question with about why the emulators have a such a difference in performance here if you know the answer on that, but I wanted to keep these questions separate: Other Question
Android Studio has an awesome tool called Memory Profiler. It helps you analyze possible memory leaks and see which calls are using up the most memory. You can even pause the processor and 'zoom in' to deep dive on the call stack.
You can use LeakCanary A memory leak detection library for Android and Java. Maintain by Square. This is one of the best developer's Tool for memory optimization and detecting leaks.here
Its an old post, but still in most of the places i found out that an android app gets around 16-32 MB memory
But when i check android Profiler, it says that my app is currently using around 350 MB memory on Samsung Galaxy S7.
I get OutOfMemoryException on my app a couple of times, I was curious why its happening. When i dig down a little i found out about 16-32 MB limit, but in actual my app is using 350 MB
I want to know how much memory a normal android phone gives to each app, or is it a variable number, and if no app is running android will not give outOfMemoryException, and if so many apps are in stack then there is a higher chance of OutOfMemoryException
But again there will be some limits.
Android devices vary significantly now that the OS is getting older. You should definitely aim for under 32mb limit if you want your app to work on lower end devices to be safe. Unless you are loading some very large images it sounds like your code is leaking memory.
Start by removing any image (or other asset) loading from your app to see if you still have problems.
If you do, check out LeakCanary, and when you find the leaks learn about them and why they are happening because it will help you immeasurably to become a better Android programmer. One of the chief ways apps leak memory is by passing an Activity context to a long running task :)
I encountered an issue with a leak on the in android's native heap in my app. The leak seems to come from LinkedBlockingQueue that is just keep growing without being cleaned up.
If you look at the look below, the native heap has a total of 478M and it keeps growing (it started from 20M and it keeps growing by around 250k every few seconds). The JVM heap is working correctly and stays at a the same levels around 100M. My app uses its own network code but even with it turned off and the app just "sits" there it still have this leak.
I have identified that the LinkedBlockingQueues are point to an com.android.okhttp.ConnectionPool instance (the same one). I don't use okhttp anywhere in my code. I do use firebase with config, database and storage support. But with the exception of the config that has attached listener the other services are not while I'm testing.
The snapshot below shows my java heap dump. The LinkedBlockingQueue has 6029 instances and almost 300M of retained memory. This number grows with the native heap increase so I'm assuming they are related.
The snapshot below shows one of the LinkedBlockingQueue$Node instances where the item is the connection pool. They all look the same and pointing to the same item.
I never encountered a memory leak like that and not sure what is the reason for it. I would appreciate if any of you have any thoughts of what it could be or if you had an issue like that before.
I figured it out. This had nothing to do with my app or firebase. It seems that Android Studio with ADB Integration may have been the cause.
When I disable the integration and used Android Device Monitor for memory and getting the logs. The native heap doesn't grow and stays at around the same levels.
Why does DDMS and Android's Running App (Settings->Apps->Running) show another allocated memory value?
DDMS shows that my application allocated memory size is equal ~40MB, on the other hand the Running App shows 80MB.
Which one value is correct? If DDMS value is correct how can I enforce the Running App to show correct value.
There is similar question, but answers are not enough for me.
I answer on my own question.
DDMS shows memory utilized only by Dalvik. The Running App show all memory which is utilized by application it is the sum of:
Native Heap
Dalvik Heap
Dalvik Other
Stack
Other dev
Graphics
and much more, in order to get detailed information about utilized memory please read Viewing Overall Memory Allocations.
I am getting OutOfMemory Exception while running my project on both emulator and device(acer tablet and samsung galaxy) showing
the application launcher process com.android.launcher has stopped unexpectedly.
I've increase the virtual machine size of emulator to 256mb still there was no change in that exception. How can I avoid this exception? And how can I increase the process size of the heap for both emulator and device?
Please refer to this question
I don't know what kind of application you are running, but it's possible that you have a memory leak in your application. Then it would not matter how big you set your virtual machine size.
Check out the video below on how to find memory leaks in your own application. Works on devices and emulators. (I found a very big memory leak last week, that I didn't know I had in the application)
http://www.youtube.com/watch?v=_CruQY55HOk&feature=player_embedded
Unless you're doing something extreme and actually need lots of memory, you shouldn't have to resort to increasing the memory footprint. The bug that's causing this will probably run over any additional memory you give it.
Take a closer look at what comes before the out-of-memory error. I recently saw that one because I caused an endless configuration change loop. The only thing that stopped that endless loop was running out of memory.
While the few lines above the error looked fine, I realized that the number of log entries was much higher than normal, because it ran through the initialization for my activity repeatedly.
Your issue may be different, but I'm fairly sure that increasing the heap size won't fix it.