分析了很多OOM的文件,有一类问题起初找不到原因,通常会根据thread_overview找到占用内存最多的线程。
但有一种情况就是从thread_overview中找不到,这个时候就得看dominator_tree,看到很多从数据库中取数据的对象,
打开一个,吓了一条,通过主键取一条数据居然占用了16M的内存。我又看了8M,4M,2M的对象,也是取一条数据的,
我断定这个与数据库表的记录长度有关系,果然,我找到了规律:
统计一个表记录的长度,
select table_name,sum(data_length) from user_tab_cols group by table_name;
数据库中记录长度 占用JVM内存17990 2M
33139 4M
44179 8M
87809 16M
从这里可以看到,使用select *带来的严重后果吧!