Android Question B4XTable - Memory leaks

epiCode

Active Member
Licensed User
I am displaying some information in B4XTable.
If user switches language, I do the following

1. Call B4XTable.clear
2. Reuse same table with a new query

During testing, I observed that If I switch back and forth the memory usage keeps expanding.
Eventually it crashes but with following in log

B4X:
Background sticky concurrent mark sweep GC freed 162034(6MB) AllocSpace objects, 2(60KB) LOS objects, 9% free, 59MB/65MB, paused 619us total 142.449ms
Background partial concurrent mark sweep GC freed 90793(3MB) AllocSpace objects, 6(248KB) LOS objects, 20% free, 63MB/79MB, paused 2.311ms total 180.352ms
Background partial concurrent mark sweep GC freed 545165(46MB) AllocSpace objects, 1(24KB) LOS objects, 30% free, 36MB/52MB, paused 1.260ms total 219.877ms
Background partial concurrent mark sweep GC freed 252946(7MB) AllocSpace objects, 0(0B) LOS objects, 27% free, 41MB/57MB, paused 704us total 239.534ms
Background sticky concurrent mark sweep GC freed 190740(5MB) AllocSpace objects, 0(0B) LOS objects, 7% free, 53MB/57MB, paused 902us total 115.060ms
Background partial concurrent mark sweep GC freed 33621(1000KB) AllocSpace objects, 0(0B) LOS objects, 22% free, 55MB/71MB, paused 1.677ms total 174.800ms
(1) too many SQL variables
android.database.sqlite.SQLiteException: too many SQL variables (code 1): , while compiling: INSERT INTO data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:996)
    at anywheresoftware.b4a.sql.SQL.ExecNonQuery2(SQL.java:85)
    at anywheresoftware.b4a.sql.SQL$1.run(SQL.java:130)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)
Skipped 220 frames!  The application may be doing too much work on its main thread.

Any pointer on what can be done/checked would be of great help.
 

klaus

Expert
Licensed User
Longtime User
Sorry, you do not give enough information.
How do you fill the B4XTable ?
In the Logs in this line:
too many SQL variables (code 1): , while compiling: INSERT INTO data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?
do you really have such a long list of values, number of question marks?
 
Upvote 0

epiCode

Active Member
Licensed User
How do you fill the B4XTable ?
B4X:
    Dim js As StringUtils
    Dim Maindb As List = js.LoadCSV2(File.DirAssets,"search.csv",",",headers)
    bt.Clear
    bt.HighlightSearchResults = True
    bt.MaximumRowsPerPage =10
    bt.PrefixSearch = False
    For x =0 To headers.Size - 1
        bt.AddColumn(headers.Get(x),1)
    Next
    bt.SetData(Maindb)
do you really have such a long list of values, number of question marks?
No. Only 47 Columns.
Only one column is displayed all others are invisible but available for search.
 
Last edited:
Upvote 0

DonManfred

Expert
Licensed User
Longtime User
Based on
the max amount of parameters defaults to 999

Your query contains 1081 parameters. Looks absurd to show them all in a b4xtable.
 
Upvote 0

epiCode

Active Member
Licensed User
Based on
the max amount of parameters defaults to 999

Your query contains 1081 parameters. Looks absurd to show them all in a b4xtable.
They should be only 47 of them for all the columns.
string builder is Dimmed locally in sub. So I'm sure it is not adding up.
puzzled myself and could not figure out why is this happening, hence the post.
 
Upvote 0

klaus

Expert
Licensed User
Longtime User
The problem is that at each call you add new columns !
To see it, add Log(bt.Columns.Size) after bt.SetData(Maindb)
Are the columns the same at each call ? Then you should add the columns only once.
Or, are only the names different ?
Or is their number and the names different ?
Depending on this the solution might be different.
 
Upvote 0

epiCode

Active Member
Licensed User
The problem is that at each call you add new columns !
To see it, add Log(bt.Columns.Size) after bt.SetData(Maindb)
Are the columns the same at each call ? Then you should add the columns only once.
Or, are only the names different ?
Or is their number and the names different ?
Depending on this the solution might be different.
Bingo! - The columns keep adding on.
So what should I do apart from b4xtable.clear ?

I need to just change visibility of a column and refresh - so I tried "update" method after changing visibility but I guess update wipes out visibility info when it 'updates' that is why I have to resort to current "clear and repopulate" method.

I tried but could not successfully create a function/method to just refresh the CLV (based on visible list)
 
Last edited:
Upvote 0
Top