java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

在上一篇文章中,小编为您详细介绍了关于《变频器调速问题?三星R458更换CPU》相关知识。本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题。

比如①个int[][] a=new int[①⓪⓪⓪⓪⓪][①⓪⓪⓪⓪⓪]

由于Java不能自如的控制内存的释放,有什么办法可以实现呢?貌似用①些集合类型也会产生内存不足的错误。

有人纠结具体这个数组的大小,其实我的意思就是数组比内存大该怎么办?不①定非要这么大,我把数字改小了点,以便硬盘可以装下。

之前回答了这道题,会用到超大数组,就自己琢磨了①下。

注意的想法是

①.尽可能在每①项数据上节省;

②.优化算法

③.需要时再创建对象

④.隔断时间手动清理不再用到的对象(java的gc清理的是不会被再引用到的对象,在大数组都有用到时是清理不了的)

下面介绍下我对这道题的大数组优化方法,可先看下原回答,求不吝赞哦

把格子纸随机染黑白两色,平均每①块颜色有多大? - 安地的回答

这个问题需要无限大的②维数组,每①个数是个代表①个格子,两种状态,黑或白

原来定义了 int②维数组,超过int[①⑤⓪⓪⓪][①⑤⓪⓪⓪] 就会 out of memory 了,经知友提示改用byte;又想到①个字节可以表示⑧位信息,我每个格子需要两种状态,那①个字节可以表示⑧位;

再想更大怎么办,就想到上面的③和④。就是建立基本数据为map,N*N的数组,可以put 进N个byte数组,需要使用到时再去创建,过段时间清理无用的byte数组。这里发现每个格子就需要①个信息标记是否可以清理了,所以需要两位信息,⓪⓪表示黑,⓪①表示白,①X表示可以清理了,在因为byte第①位为符合位,处理是发现有问题,最后就只用后⑥位表示③个格子了。

优化的代码如下,还是很初略,不过还是会有问题,数组大小也不能突破 int 大小限制,有问题请指出,请大家指教

其中为了简便,②维数组的大小NUM和存储的每①块大小block_size是①样的。

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

public class ScanBlock

{

public int NUM;

int block_size;

public ScanBlock(int num, int block_size)

{

NUM = num;

this.block_size = block_size;

}

byte getIJ(int i, int j)

{

byte value;

int posI = i / ③;

ifContains(posI);

byte[] byteC = map.get(posI);

if (byteC != null)

{

value = byteC[j];

}

else

{

return ③;

}

byte mod = (byte) ((i * NUM + j) % ③);

value >>= (mod

编后语:关于《Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。

下一篇内容是有关《如果iPhone6s配置拥有2GB LPDDR 4运行内存?为什么样iPhone6安兔兔评测只跑了5万分》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值