[原] Oracel JDBC 内存 问题

About Oracle JDBC memory

[本文原创链接: http://www.smithfox.com/?e=153 , 转载请保留此声明, 谢谢 ]

Oracle JDBC 驱动, 在大数据量查询时会使用大量的内存, 如果控制不好很容易导致Java出现Out of memory错误.

耗内存有多方面的原因: 主要包括五个方面: (下面的讨论全部基于我自己的环境: ojdbc6.jar, version是11.1.0.7.0-Production, Oracle 10G, Java6(JDBC4) )

Read More

smithfox | Friday 24 June 2011 at 11:53 am | | Java | No comments        | Used tags: , , , ,

Java 原始数据类型 和 字节数组 互转

convert java primitive data type into byte array

Java中有时需要手动序列化(或是类似行为), ByteBuffer和DataOutput和DataInput有点笨重, 必须要new对象, 对于字节操作密集型程序, 在粒度很小但却调用非常频繁的代码段new对象, 很不划算.

我无意中发现了 JDK 中的 java.nio.Bits 做了这方面的事, 但是这个类没有public, 于是我直接将code copy整理出来做成一个util类.

需要注意的是: 数值类型和 字节互转时, 涉及到 大端和小端的问题, 此处一律用大端(Java默认, 以及标准的网络字节序都是大端)

该util类没有包含 float和double, 因为我的程序需要有精确比较, 所有有小数点的值必须用BigDecimal, 所以我就没有处理float和double了.

String类型涉及到charset问题, 可以通过String类自身函数做到和byte数组之间的互相转换.

Read More

smithfox | Friday 10 June 2011 at 3:51 pm | | Java | Six comments       

Java append 二进制大文件的几种方法速度比较

compare performance writing binary to large file using various methods

测试环境: Windows7 SP1, 32bit, 4G mem, Intel i5 CPU

循环100万次写大约20几个字节, 最终结果:

用150K缓存的ByteBuffer和RandomAccessFile写, D:/test2.tmp spent time=177毫秒

用1M缓存的ByteBuffer和RandomAccessFile写, D:/test3.tmp spent time=177毫秒

用150K的mapsize的MappedByteBuffer写, D:/test4.tmp spent time=320毫秒

用150K缓存的OutputStream写, D:/test5.tmp spent time=610毫秒

具体看代码(注释更详尽的分析):

Read More

smithfox | Wednesday 08 June 2011 at 9:00 pm | | Java | Eight comments       

[备忘] Java 用 ByteBuffer和RandomAccessFile 写大文件

write large file using ByteBuffer and RandomAccessFile

参考了文章: http://tutorials.jenkov.com/java-nio/buffers.html, <Think in Java 4th>

Read More

smithfox | Tuesday 07 June 2011 at 6:20 pm | | Java | Six comments       

[备忘] Java BigDecimal 转换 为 字节 数组

Java BigDecimal Serialization 手动序列化

直接看代码:

Read More

smithfox | Friday 03 June 2011 at 4:20 pm | | Java | Eight comments        | Used tags: , , ,

[备忘] Java Object Size

参考文章: http://devblog.streamy.com/2009/07/24/determine-size-of-java-object-class/

Java没有 C 语言的 sizeof, 所以一个对象所占用的内存, 需要用profiler 工具才能得出.

当项目的最底层的对象有千万数量级别时, 需要非常谨慎地设计类, 以控制 Object Size, 否则很容易出现 Out of Memory.

无论是静态函数, 还是成员函数, 都不会计入 Object Size, 所以可以放心地加入function.

尽量用原生数据类型(byte, char, boolean, int ,long, xxx), 而不是wrapper类型(Integer, Boolean, Long, xxx)

int 占 4个字节, 而 Integer占20个字节

String 占 12 bytes, boolean = 1 byte,  byte = 1 byte, int = 4 bytes, long = 8 bytes.

除了原生数据类型和 wrapper类型, 一般对象型数据成员占 4 个 bytes, 有点象指针.

要尽量减少成员变量的数目:

1. 不要为中间运算方便而设置的成员变量.

2. 不要将业务上的parent对象放进来, 尽管在OOP中, 这样会带来很多的方便.

不用说, 集合肯定是优先用 [], 而不是java.util.xxx中的Collections类(比如Map,List)

smithfox | Monday 30 May 2011 at 5:06 pm | | Java | Three comments       

[备忘] Java enum 两点用法

Effective Java 2nd edition中说: 在Java5以后, 最好的单例模式应该是用 enum 来实现:

enum MySingleton {  
  INSTANCE;  
  public static MySingleton getInstance() {  
    return INSTANCE;  
  }  
}

见一篇中文的分析 http://blog.csdn.net/java2000_net/archive/2009/03/12/3983958.aspx

Read More

smithfox | Wednesday 11 May 2011 at 2:11 pm | | Java | Two comments       

Micro Patterns in Java Code

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.103.2115&rep=rep1&type=pdf

有时间再看

smithfox | Wednesday 11 May 2011 at 1:58 pm | | Java | Five comments