B4J Question jPOI- Things to know when dealing with Big data

incendio

Well-Known Member
Licensed User
Longtime User
Hello guys,

I have app that export data from database server to excel file. Data has 49 columns.

When data only a few hundreds records, the app worked as expected, but when it reach about +/- 200K records, it raised an error :

#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000626cd331, pid=980, tid=0x00000000000001b0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_92-b14) (build 1.8.0_92-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x3fd331]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Data\B4J\ExportXL\Objects\hs_err_pid980.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#

App used connection pool to collect data.
Attached is an error report file.

Any idea how to fix this error?

Thanks in advance.
 

Attachments

  • hs_err_pid980.zip
    7.4 KB · Views: 284

incendio

Well-Known Member
Licensed User
Longtime User
No Avail.

Reduced data to about 70K and run jar with
B4X:
java -Xms8192m -Xmx8192m -jar

Still crashed. On Windows Task Manager, when it memory reached about 4GB, it crashed.
 
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
Testing with 10K data, run OK, but it took about 1.8GB RAM, so massive.

You were right, probably it was crashed due to out of available memory.

Any hint / idea how to overcame this problem?
 
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
Yes, I am using 64 bit Java.

Here are the codes :
B4X:
Private SQTbl As SQL
Private wb As PoiWorkbook
Private ws As PoiSheet
Private row As PoiRow

Dim SenderFilter As Object = SQTbl.ExecQueryAsync("SQL", "SELECT a.* from CNT_GET_MONTHLY_SLS(2015,5) a", Null)
Wait For (SenderFilter) SQL_QueryComplete (Success As Boolean, RS As ResultSet)

If Success Then
   Private RowNo = 6,i = 1 As Int

   If wb.IsInitialized = False Then
      wb.InitializeExisting(File.DirApp,"CntRcpMonthlySls.xlsx","")
      ws = wb.GetSheet(0)
   End If

   Do While RS.NextRow
         row = ws.CreateRow(RowNo)
         row.CreateCellString(0,RS.GetString("REGION"))
         row.CreateCellString(1,RS.GetString("AREA"))
         row.CreateCellString(2,RS.GetString("CTY"))
         row.CreateCellString(3,RS.GetString("KOORD"))
         row.CreateCellString(4,RS.GetString("DEPT"))
         row.CreateCellString(5,RS.GetString("CD"))
         row.CreateCellString(6,RS.GetString("COUNTER"))
         row.CreateCellString(7,RS.GetString("SB_GRP"))
         row.CreateCellString(8,RS.GetString("GRP"))
         row.CreateCellString(9,RS.GetString("PRD_YR"))
         row.CreateCellString(10,RS.GetString("ART"))
         row.CreateCellString(11,RS.GetString("CL"))

         row.CreateCellNumeric(12,RS.GetInt("Y1M1"))
         row.CreateCellNumeric(13,RS.GetInt("Y1M2"))
         row.CreateCellNumeric(14,RS.GetInt("Y1M3"))
         row.CreateCellNumeric(15,RS.GetInt("Y1M4"))
         row.CreateCellNumeric(16,RS.GetInt("Y1M5"))
         row.CreateCellNumeric(17,RS.GetInt("Y1M6"))
         row.CreateCellNumeric(18,RS.GetInt("Y1M7"))
         row.CreateCellNumeric(19,RS.GetInt("Y1M8"))
         row.CreateCellNumeric(20,RS.GetInt("Y1M9"))
         row.CreateCellNumeric(21,RS.GetInt("Y1M10"))
         row.CreateCellNumeric(22,RS.GetInt("Y1M11"))
         row.CreateCellNumeric(23,RS.GetInt("Y1M12"))
 
         row.CreateCellNumeric(24,RS.GetInt("Y2M1"))
         row.CreateCellNumeric(25,RS.GetInt("Y2M2"))
         row.CreateCellNumeric(26,RS.GetInt("Y2M3"))
         row.CreateCellNumeric(27,RS.GetInt("Y2M4"))
         row.CreateCellNumeric(28,RS.GetInt("Y2M5"))
         row.CreateCellNumeric(29,RS.GetInt("Y2M6"))
         row.CreateCellNumeric(30,RS.GetInt("Y2M7"))
         row.CreateCellNumeric(31,RS.GetInt("Y2M8"))
         row.CreateCellNumeric(32,RS.GetInt("Y2M9"))
         row.CreateCellNumeric(33,RS.GetInt("Y2M10"))
         row.CreateCellNumeric(34,RS.GetInt("Y2M11"))
         row.CreateCellNumeric(35,RS.GetInt("Y2M12"))
     
         row.CreateCellNumeric(36,RS.GetInt("Y3M1"))
         row.CreateCellNumeric(37,RS.GetInt("Y3M2"))
         row.CreateCellNumeric(38,RS.GetInt("Y3M3"))
         row.CreateCellNumeric(39,RS.GetInt("Y3M4"))
         row.CreateCellNumeric(40,RS.GetInt("Y3M5"))
         row.CreateCellNumeric(41,RS.GetInt("Y3M6"))
         row.CreateCellNumeric(42,RS.GetInt("Y3M7"))
         row.CreateCellNumeric(43,RS.GetInt("Y3M8"))
         row.CreateCellNumeric(44,RS.GetInt("Y3M9"))
         row.CreateCellNumeric(45,RS.GetInt("Y3M10"))
         row.CreateCellNumeric(46,RS.GetInt("Y3M11"))
         row.CreateCellNumeric(47,RS.GetInt("Y3M12"))
         row.CreateCellNumeric(48,RS.GetInt("TTL"))
      
         RowNo = RowNo + 1
         i = i+1
     Loop
     RS.Close
Else
     Log(LastException)
End If

'Total   
row = ws.CreateRow(RowNo)
row.CreateCellString(0,"")
row.CreateCellString(1,"")
row.CreateCellString(2,"")
row.CreateCellString(3,"")
row.CreateCellString(4,"")
row.CreateCellString(5,"")
row.CreateCellString(6,"")
row.CreateCellString(7,"")
row.CreateCellString(8,"")
row.CreateCellString(9,"")
row.CreateCellString(10,"")
row.CreateCellString(11,"")
 
row.CreateCellFormula(12,$"sum($M7:$M${RowNo})"$)
row.CreateCellFormula(13,$"sum($N7:$N${RowNo})"$)
row.CreateCellFormula(14,$"sum($O7:$O${RowNo})"$)
row.CreateCellFormula(15,$"sum($P7:$P${RowNo})"$)
row.CreateCellFormula(16,$"sum($Q7:$Q${RowNo})"$)
row.CreateCellFormula(17,$"sum($R7:$R${RowNo})"$)
row.CreateCellFormula(18,$"sum($S7:$S${RowNo})"$)
row.CreateCellFormula(19,$"sum($T7:$T${RowNo})"$)
row.CreateCellFormula(20,$"sum($U7:$U${RowNo})"$)
row.CreateCellFormula(21,$"sum($V7:$V${RowNo})"$)
row.CreateCellFormula(22,$"sum($W7:$W${RowNo})"$)
row.CreateCellFormula(23,$"sum($X7:$X${RowNo})"$)
row.CreateCellFormula(24,$"sum($Y7:$Y${RowNo})"$)
row.CreateCellFormula(25,$"sum($Z7:$Z${RowNo})"$)

row.CreateCellFormula(26,$"sum($AA7:$AA${RowNo})"$)
row.CreateCellFormula(27,$"sum($AB7:$AB${RowNo})"$)
row.CreateCellFormula(28,$"sum($AC7:$AC${RowNo})"$)
row.CreateCellFormula(29,$"sum($AD7:$AD${RowNo})"$)
row.CreateCellFormula(30,$"sum($AE7:$AE${RowNo})"$)
row.CreateCellFormula(31,$"sum($AF7:$AF${RowNo})"$)
row.CreateCellFormula(32,$"sum($AG7:$AG${RowNo})"$)
row.CreateCellFormula(33,$"sum($AH7:$AH${RowNo})"$)
row.CreateCellFormula(34,$"sum($AI7:$AI${RowNo})"$)
row.CreateCellFormula(35,$"sum($AJ7:$AJ${RowNo})"$)
row.CreateCellFormula(36,$"sum($AK7:$AK${RowNo})"$)
row.CreateCellFormula(37,$"sum($AL7:$AL${RowNo})"$)
row.CreateCellFormula(38,$"sum($AM7:$AM${RowNo})"$)
row.CreateCellFormula(39,$"sum($AN7:$AN${RowNo})"$)
row.CreateCellFormula(40,$"sum($AO7:$AO${RowNo})"$)
row.CreateCellFormula(41,$"sum($AP7:$AP${RowNo})"$)
row.CreateCellFormula(42,$"sum($AQ7:$AQ${RowNo})"$)
row.CreateCellFormula(43,$"sum($AR7:$AR${RowNo})"$)
row.CreateCellFormula(44,$"sum($AS7:$AS${RowNo})"$)
row.CreateCellFormula(45,$"sum($AT7:$AT${RowNo})"$)
row.CreateCellFormula(46,$"sum($AU7:$AU${RowNo})"$)
row.CreateCellFormula(47,$"sum($AV7:$AV${RowNo})"$)
row.CreateCellFormula(48,$"sum($AW7:$AW${RowNo})"$)
   
Private BorderSum As PoiCellStyle
   
If BorderSum.IsInitialized = False Then BorderSum.Initialize(wb)
   
BorderSum.BorderTop  = BorderSum.BORDER_DOUBLE
BorderSum.BorderBottom = BorderSum.BORDER_DOUBLE
BorderSum.BorderLeft  = BorderSum.BORDER_THIN
BorderSum.BorderRight  = BorderSum.BORDER_THIN

For i = 0 To 48
     row.GetCell(i).CellStyle = BorderSum
Next

DateTime.DateFormat= "MMddyy"
DateTime.TimeFormat="HHmmss"
Private stDateTime="_" & DateTime.Date(DateTime.Now) & "_" & DateTime.Time(DateTime.now) As String
   
FName = "Rpt" & stDateTime & ".xlsx"

wb.Save(File.DirApp,FName)
fx.ShowExternalDocument(File.GetUri(File.DirApp, FName))

Query retrieve from sql server are about 70K, program crashed.

If query change to this, so it will only retrive 10K :
B4X:
Dim SenderFilter As Object = SQTbl.ExecQueryAsync("SQL", "SELECT a.* from CNT_GET_MONTHLY_SLS(2015,5) a rows 10000", Null)

It runs OK, but use about 1.8GB RAM.
 
Last edited:
Upvote 0

Daestrum

Expert
Licensed User
Longtime User
Your problem is being amplified by the fact that not only are you trying to read 200+K records into memory, but you are also holding the worksheet in memory.
You may have to resort to reading the resultset by having the jdbc driver stream it to your app as a single result each time.
See this page http://benjchristensen.com/2008/05/27/mysql-jdbc-memory-usage-on-large-resultset/ - which has a good explanation of how to change the jdbc statement, to make it read a record at a time.
Note the caveats on it locking the database file.
 
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
I am using Firebird database & yes, there is a command in firebird jdbc to set fetch size, but don't know how to execute it in B4J.
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
This program creates a sheet with 100,000 rows and 50 columns:
B4X:
Sub AppStart (Args() As String)
   Dim pw As PoiWorkbook
   pw.InitializeNew(True)
   Dim sheet As PoiSheet = pw.AddSheet("sheet1", 0)
   For RowNumber = 1 To 100000
     Dim Row As PoiRow = sheet.CreateRow(RowNumber)
     For ColNumber = 1 To 50
       Row.CreateCellString(ColNumber, "Col: " & ColNumber)
     Next
     If RowNumber Mod 1000 = 0 Then Log(RowNumber)
   Next
   File.Delete(File.DirApp, "1.xlsx")
   pw.Save(File.DirApp, "1.xlsx")
   pw.Close
   ExitApplication
End Sub
Works fine here. Do you get any error?
 
Upvote 0

OliverA

Expert
Licensed User
Longtime User
Looks like the setFetchSize method applies to both the Statement and the ResultSet objects of JDBC (for usage see here). This method and the Statement object are not exposed by jSQL, so some JavaObject or Reflection code would be needed to get to this method/object.

Optionally, you could use Firebird's ROWS <m> [TO <n>] clause (or if older version is used the [FIRST <m>] [SKIP <n>] clause) of the SELECT statement to iterate through a batch of records at a time from the Firebird database.

Edit:
Firebase documentation links:
FIRST... (http://www.firebirdtest.com/file/do...langref25-en/html/fblangref25-dml-select.html)
ROWS... (http://www.firebirdtest.com/file/do...5-dml-select.html#fblangref25-dml-select-rows)
 
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
This program creates a sheet with 100,000 rows and 50 columns:
B4X:
Sub AppStart (Args() As String)
   Dim pw As PoiWorkbook
   pw.InitializeNew(True)
   Dim sheet As PoiSheet = pw.AddSheet("sheet1", 0)
   For RowNumber = 1 To 100000
     Dim Row As PoiRow = sheet.CreateRow(RowNumber)
     For ColNumber = 1 To 50
       Row.CreateCellString(ColNumber, "Col: " & ColNumber)
     Next
     If RowNumber Mod 1000 = 0 Then Log(RowNumber)
   Next
   File.Delete(File.DirApp, "1.xlsx")
   pw.Save(File.DirApp, "1.xlsx")
   pw.Close
   ExitApplication
End Sub
Works fine here. Do you get any error?

Worked fine, RAM usage about 600MB.
I thought this code would release RAM
B4X:
pw.Close
But apparently not, RAM only released after app closed.
 
Upvote 0

OliverA

Expert
Licensed User
Longtime User
But apparently not, RAM only released after app closed
We're talking about Java here and garbage collection. Java's garbage collection can be "lazy" and not reclaim the memory unless required by the app itself (or after some long inactivity). It does not really mean it's not available (for the app). Yes, for other applications in the system, the memory is unavailable.

Edit: changed release to reclaim. The memory has been released (most likely, if done properly by the pw.Close), it just has not been reclaimed yet.
 
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
Looks like the setFetchSize method applies to both the Statement and the ResultSet objects of JDBC (for usage see here). This method and the Statement object are not exposed by jSQL, so some JavaObject or Reflection code would be needed to get to this method/object.

Optionally, you could use Firebird's ROWS <m> [TO <n>] clause (or if older version is used the [FIRST <m>] [SKIP <n>] clause) of the SELECT statement to iterate through a batch of records at a time from the Firebird database.

Edit:
Firebase documentation links:
FIRST... (http://www.firebirdtest.com/file/do...langref25-en/html/fblangref25-dml-select.html)
ROWS... (http://www.firebirdtest.com/file/do...5-dml-select.html#fblangref25-dml-select-rows)
This idea has crossed my mind, but the problem remain.
Restrict data fetched still facing the RAM problem.

More row created with jPOI, more RAM usage, so soon / later, with big data, RAM will not enough.
 
Upvote 0

OliverA

Expert
Licensed User
Longtime User
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
This is strange, I set query to retrieve the first 5K data and add sub Log in do while loop, like this
B4X:
Dim SenderFilter As Object = SQTbl.ExecQueryAsync("SQL", "SELECT a.* from CNT_GET_MONTHLY_SLS(2015,5) a rows 5000", Null)
Do While RS.NextRow
   Log(RowNo)
   .....
   .....
loop

App crushed after processed about 250 data. That query, if fetch all, contain about 70K data.
If sub Log commented or deleted, app runs OK.

On the other hand, changed that query to the query that if fetch all, contain about 1K data, those codes run OK.
Could it be the problem was not in jPOI, but in Result Set?

See this (https://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream), but I don't know how to apply it to jPOI.
I think, only Erel can apply this :)
 
Last edited:
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
You are correct that the first step is to identify which part if the problematic one. It seems like the problem is in the JDBC driver.

Make some tests.
Make sure that you are using the latest version of their driver.
I have already use the latest driver version.

I have tried to divided data fetched into separate operation. The logic code is something like this
B4X:
Private FirstRow,RowsFetched As Int
SourceFile = "1.xlsx"
FirstRow   = 6
Sub Test
   for i = 1 to 1000
      FName     = GenerateUniqFileName("Tmp")
      StartRow = (i-1)*1000
      EndRow = i*1000
      FirstRow = 6
      SqSt = "SELECT a.* from LARGE_DT a rows " & StartRow & " to " & EndRow
      RowsFetched = RetriveDataSaveToExcel(FirstRow,SqlSt,SourceFile,FName)

      If FirstRow <> RowsFetched Then
         Log("rowno : " & FirstRow )
         Log("RowsFetched : " & RowsFetched)
         FirstRow  = RowsFetched
         SourceFile = FName
         P.Progress = i/MaxRowsFetched
         Sleep(50)
     Else
       P.Progress = 1
       i = 2000
     End If
   Next
EndSub

Sub RetriveDataSaveToExcel(FirstRow,SqlSt,SourceFile,FName) As int
   Private wb As PoiWorkbook
   Private ws As PoiSheet
   Private row As PoiRow
   Private RS As ResultSet
   
   wb.InitializeExisting(File.DirApp,SourceFile,"")
   ws = wb.GetSheet(0)

   RS = SQTbl.ExecQuery(SqSt)
   Do While RS.NextRow
      FirstRow = ws.CreateRow(FirstRow )
      ....
      FirstRow = FirstRow + 1
   Loop
   wb.Save(File.DirApp,FName)
   wb.Close
   
   Return FirstRow  
End Sub

From those code, found that RAM usage keep increasing and then it crashed. But this time, seem that, it was not crashed because of not enough RAM, but because I/O error. It happen when rows reached about 12K. Here are the error message :

Tmp_100417_110046.xlsx
rowno : 6
RowsFetched : 1006
Tmp_100417_110146.xlsx
rowno : 1006
RowsFetched : 2006
Tmp_100417_110247.xlsx
rowno : 2006
RowsFetched : 3006
Tmp_100417_110347.xlsx
rowno : 3006
RowsFetched : 4006
Tmp_100417_110448.xlsx
rowno : 4006
RowsFetched : 5006
Tmp_100417_110551.xlsx
rowno : 5006
RowsFetched : 6006
Tmp_100417_110655.xlsx
rowno : 6006
RowsFetched : 7006
Tmp_100417_110800.xlsx
rowno : 7006
RowsFetched : 8006
Tmp_100417_110905.xlsx
rowno : 8006
RowsFetched : 9006
Tmp_100417_111013.xlsx
rowno : 9006
RowsFetched : 10006
rowno : 10006
RowsFetched : 11006
Tmp_100417_111231.xlsx
java.lang.RuntimeException: java.io.IOException: Failed to read zip entry source
at anywheresoftware.b4a.keywords.Common$2$1.run(Common.java:1015)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Failed to read zip entry source
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:103)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:185)
at anywheresoftware.b4j.objects.PoiWorkbookWrapper.InitializeExisting(PoiWorkbookWrapper.java:53)
at b4j.example.main._v0(main.java:251)
at b4j.example.main$ResumableSub_btnStart_Action.resume(main.java:169)
at anywheresoftware.b4a.keywords.Common$2$1.run(Common.java:1013)
... 7 more
Caused by: java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data. This may indicate that the file is used to inflate memory usage and thus could pose a security risk. You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit. Counter: 887147, cis.counter: 8864, ratio: 0.009991579749466548Limits: MIN_INFLATE_RATIO: 0.01
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.advance(ZipSecureFile.java:266)
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:221)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:132)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:56)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:100)
... 13 more

So, beside RAM problem, it has also a problem on I/O with large of data.

Seem that jPOI unable to handle large data.

In case someone interested, attached is a sql file for create table and create sample data, only 15K rows.
 

Attachments

  • Create_ins.zip
    177.5 KB · Views: 263
Upvote 0

incendio

Well-Known Member
Licensed User
Longtime User
Try to write the data to a new workbook instead of loading an existing one.

Tested with real data(about 200K rows), mostly, it worked, RAM usage also only about 200MB, but only if this codes removed :
B4X:
Private Sub SetXLBorder(wb As PoiWorkbook, xlrow As PoiRow, NoOfCol As Short)
  Private XLBorderS As PoiCellStyle

  XLBorderS.Initialize(wb)
 
  XLBorderS.BorderBottom = XLBorderS.BORDER_HAIR 
  XLBorderS.BorderRight  = XLBorderS.BORDER_THIN

  For i = 0 To NoOfCol - 1
  xlrow.GetCell(i).CellStyle = XLBorderS
  Next
End Sub

With that codes, RAM increased fast, up to 2GB and more, then error raised, but not because not enough RAM.
Here are the error messages :

java.lang.IllegalStateException: The maximum number of Cell Styles was exceeded. You can define up to 64000 style in a .xlsx Workbook
at org.apache.poi.xssf.model.StylesTable.createCellStyle(StylesTable.java:778)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.createCellStyle(XSSFWorkbook.java:725)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createCellStyle(SXSSFWorkbook.java:867)
at anywheresoftware.b4j.objects.PoiCellStyleWrapper.Initialize(PoiCellStyleWrapper.java:54)
at b4j.example.main._vv2(main.java:546)
at b4j.example.main._v0(main.java:368)
at b4j.example.main$ResumableSub_btnStart_Action.resume(main.java:132)
at b4j.example.main._btnstart_action(main.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:90)
at anywheresoftware.b4a.BA$1.run(BA.java:215)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)

Without formatting, excel file is quiet difficult to read. No other way to format excel file, like add borders, set columns width, etc?

Beside, sometime, error access violation still raised even codes for set borders removed.
When error happen, RAM usage was low, below 200MB, so, this was not because not enough RAM.
Here are the error messages :
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000002a009bf, pid=2072, tid=0x000000000000135c
#
# JRE version: Java(TM) SE Runtime Environment (8.0_92-b14) (build 1.8.0_92-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# v ~StubRoutines::atomic_xchg
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Data\B4J\ExportXL\Objects\hs_err_pid2072.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
 
Upvote 0
Top