Profiling JavaFX Mobile applications

Today is a great day for every developer of JavaFX Mobile applications. You wonder why? Because the JavaME SDK 3.0 was released. It was long, hard work, from what I heard during our lunch breaks, but the result is a fantastic tool. Congratulations to the whole team and I am looking forward to celebrate this launch with you guys! 🙂

Some people might be wondering now, JavaME SDK – JavaFX Mobile, where is the connection? The JavaME SDK finally enables a so far well hidden functionality of JavaFX Mobile: profiling – which makes it the most important tool for JavaFX Mobile developers in my opinion. (Ok, maybe I am a little biased here, because performance is my day-to-day job…) 😉

Oh, yea, right. The JavaME SDK is also a great tool for developing JavaME applications – at least that’s what I heard. 😛

The remainder of this article will explain, how you enable the profiler, what you have to consider while profiling and finally how to view the results.

Enabling the profiler

To enable profiling of a JavaFX Mobile application, you need to change the settings of the VM. This is conveniently possible simply by changing the properties of one of the predefined devices (Alternatively you can define a new device explicitly for profiling.) To enable profiling with the default device DefaultFxPhone1, open the file device.properties in ~/javafx-sdk/1.1/work/0, which is located in your home-folder. You need to start the emulator at least once, so that the folder and file are created. If you look at the content, it will look similar to this:

#
# Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
phone.number: 123456789
runtime.internal.com.sun.io.j2me.apdu.hostsandports = localhost:9025,localhost:9026
profiler.enabled: false
profiler.file: data.prof
netmon.enabled: false
runtime.internal.JAVA_HEAP_SIZE: 15728640
runtime.internal.MAIN_MEMORY_CHUNK_SIZE: 26214400
runtime.internal.microedition.locale: en-US

File Content of device.properties

For profiling we are only interested in the properties profiler.enabled and profiler.file. Enable profiling by setting the flag profiler.enabled:

profiler.enabled: true

The property profiler.file determines where the profiling data will be stored. If you do not change the default, it will be stored in the file data.prof in the same directory as device.properties. After you have changed the properties, you have to restart the emulator and the device-manager.

Running a profiling-session

Whenever you run an application in the emulator now, it will be profiled. After the application finishes, the result will be stored in the file which is configured in device.properties. Be aware, if you run two applications, the finishing the second one will overwrite the profiling data of the first application, so be sure to copy the file before running the second application.

While profiling, two issues need to be considered. First of all an application, which is profiled, runs extremely slow. In fact it runs so slow, that any user interaction is very difficult, if not impossible. The best option is to make your test run fully automated without the need of user interaction. The slow execution also affects animations, almost all frames will be dropped when profiling. You can change the duration of an animation if it is important to execute more frames.

The other issue to consider is, that the VM needs some time to write the profiling data to the file system after your application finishes. If you close the emulator window directly, the VM will be shutdown immediately and the file with the profiling data is usually corrupted.

One solution to overcome this is to make sure the application finishes by itself. You can call FX.exit() to quit a JavaFX application anytime. If you need to stop the application manually, press the red cancel button on the device. This will put the JavaFX application in the background and show the AMS (Application Management System). From there you can end the application without stopping the VM by selecting the running application and selecting “End” from the menu.

Viewing the profiling data

This is were the JavaME SDK finally comes into play. Start the SDK and select the entry “Import Java ME SDK snapshot…” from the menu Tools to load the file generated in your profiling session. This will open a view similar to the profiler window in NetBeans and give you an easy to use representation of the generated data.

2 responses to “Profiling JavaFX Mobile applications”

  1. maheshdixit Avatar
    maheshdixit

    Useful information.I also have an idea for a JavaME application and that’s the reason why I am eager to participate in the Forum Nokia Developer Conference ’09 to be held in Bangalore this December. http://www.nokiadevcon.in/index.php

  2. Ginkan Avatar
    Ginkan

    hi Michael,
    I am so glad that you write this weblog,
    cause I found almost none of JFX Mobile resource and tutorial out there.

    By the way,
    could you please write a tutorial for “HttpRequest sink” in mobile??
    the following code is a part of a simple downloading app in mobile, it took my couple of month and still cannot solve the “sink” problem:

    def HttpRequest$1: HttpRequest = HttpRequest {
    def fc$1:FileConnection = Connector.open(“file:///xxx.jpg”) as FileConnection;
    location:”http://www.xxx.com/xxx.jpg”
    sink: fc$1.openOutputStream() //<——- HELP =]