db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kristian Waagan <Kristian.Waa...@Sun.COM>
Subject Maximum size of materialized LOB
Date Wed, 12 Jul 2006 14:40:59 GMT

I have been playing around with the length less streaming overloads in 
JDBC4. In the discussion of DERBY-1471, it was suggested that we forgot 
about the layerB streaming in DRDA at the moment and instead implemented 
a much simpler approach. When we have what we need, we can improve the 
length less overloads.

The planned approach on the client side is to create a LOB and have it 
materialize the whole stream in memory to determine the length. The LOB 
is then sent to the server by using the existing methods/API, which 
require a length argument.

I have seen that the maximum possible size of a byte array is 
Integer.MAX_VALUE. However, when I tried this out, I was not able to 
create such a big array in all VMs. I got this error message:
java.lang.OutOfMemoryError: Requested array size exceeds VM limit

Does anyone know what's causing these reduced sizes?
Here are the numbers (all Sun VMs):
1.3		2^31 -20
1.4		2^31 -20
1.5, -d32	2^31 -20
1.5, -d64	2^31 -40
1.6, -d32	2^31 -1  <---- as expected

Thus, maximum LOB size in Derby for the new length less overloads is 
limited by two factors (seen from the client):
	1) Memory on the client (need at least 2xLOB size + overhead)
	2) Maximum size of byte array (in range [2^31 -40, 2^31 -1])

Since 1) will be in effect most of the time (still not common with >4G 
RAM is it?), 2) will almost never be seen. I don't plan to support LOBs 
of 2^31 -1 bytes if the VM don't support that big byte arrays...

Out of curiosity, does anyone know the max limit for byte arrays on 
other VMs?
I attached the little program I used, don't forget to set the maximum 
heap size high enough.


View raw message