Redian新闻
>
java如何keep大数组在内存中?
avatar
java如何keep大数组在内存中?# Java - 爪哇娇娃
e*y
1
六月末的纽约依旧没有盛夏的踪影,雨三天两头就下一场,刷牙时,望一眼窗外的后院
,又看到青草红花在阴天里更显楚楚动人。北方的阴雨天消失得很快,天一会如铅色,
可能不到一个小时,太阳就出来了,又望得见阳光,南方的雨季就不同了,雨一落,你
无法猜估他什么时候会停,绵绵细雨不断。这么一比较,我就想那个笑话了:
猛男A说:我一天三日,你呢?
猛男B说:我三天一日。
猛男A说:啊?
猛男B说:是的,但是我一日三天。
猛男A=北方的雨
猛男B=南方的雨
avatar
b*y
2
比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了,
也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。
有啥办法能够keep这种数据在内存中吗?
我想了一些办法,不过也想听听版上大牛们的建议。
avatar
a*d
3
@@
好像有点。。。

【在 e**y 的大作中提到】
: 六月末的纽约依旧没有盛夏的踪影,雨三天两头就下一场,刷牙时,望一眼窗外的后院
: ,又看到青草红花在阴天里更显楚楚动人。北方的阴雨天消失得很快,天一会如铅色,
: 可能不到一个小时,太阳就出来了,又望得见阳光,南方的雨季就不同了,雨一落,你
: 无法猜估他什么时候会停,绵绵细雨不断。这么一比较,我就想那个笑话了:
: 猛男A说:我一天三日,你呢?
: 猛男B说:我三天一日。
: 猛男A说:啊?
: 猛男B说:是的,但是我一日三天。
: 猛男A=北方的雨
: 猛男B=南方的雨

avatar
l*g
4
做个singleton的class,里面放这个array。

比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
如果有很长一段时间不reference这个数组了,貌似操作系统自动的........

【在 b******y 的大作中提到】
: 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
: 如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了,
: 也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。
: 有啥办法能够keep这种数据在内存中吗?
: 我想了一些办法,不过也想听听版上大牛们的建议。

avatar
b*y
5

不是singleton不singleton能解决的。是说,这个array太大了,jvm/operating
system会自动的放到disk去,如果数组很长时间没有被access话。

【在 l*******g 的大作中提到】
: 做个singleton的class,里面放这个array。
:
: 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
: 如果有很长一段时间不reference这个数组了,貌似操作系统自动的........

avatar
e*t
6
能确定到底是jvm还是os把内存swap出去了么?
jvm方面,不知道有什么办法。但是对于os,应该有办法把那些page pin在内存里吧。

【在 b******y 的大作中提到】
:
: 不是singleton不singleton能解决的。是说,这个array太大了,jvm/operating
: system会自动的放到disk去,如果数组很长时间没有被access话。

avatar
b*y
7

恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天
(os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他
的好主意,我还没想到。

【在 e*****t 的大作中提到】
: 能确定到底是jvm还是os把内存swap出去了么?
: jvm方面,不知道有什么办法。但是对于os,应该有办法把那些page pin在内存里吧。

avatar
n*u
8
加个 low priority thread, 定期假装读这个大树组, keep its memory hot.

【在 b******y 的大作中提到】
:
: 恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天
: (os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他
: 的好主意,我还没想到。

avatar
l*g
9

这个你要求有点怪。Java本身就是做到了与系统无关的设计,所以才有JVM这个东西,
如果,你需要这么细微的控制底层的东西,那你就不应该用Java来做。直接用C语言更
靠谱。
你最好能给出整个问题的context,这样也许大家可以更好地帮助你。你也可以选择去
stackoverflow去问问,那里真正的牛人多。

【在 b******y 的大作中提到】
:
: 恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天
: (os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他
: 的好主意,我还没想到。

avatar
l*0
10
“如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了
,也就是,这个数组进了disk 缓存区了”
这个你是怎么判断出来的?

【在 b******y 的大作中提到】
: 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
: 如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了,
: 也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。
: 有啥办法能够keep这种数据在内存中吗?
: 我想了一些办法,不过也想听听版上大牛们的建议。

avatar
b*y
11

系统启动的时候,会将这个数组掉到内存里,就是initialize一下。但如果系统待命的
时间一长了,用户使用系统的时候,程序会再次调用这个数组,这个时候就发现系统会
很明显的慢一下。所以,可以肯定是因为操作系统把这个数组的内存区置换成了其他程
序的东西了。也就是被page out了。但,稍稍等一下后,系统反应又正常了。
就是说,不断load程序用到这个数组的时候,没事儿。但一旦中间间隔长了,程序空转
,没有用户使用,再次用到程序,就会有这个现象。

【在 l******0 的大作中提到】
: “如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了
: ,也就是,这个数组进了disk 缓存区了”
: 这个你是怎么判断出来的?

avatar
x*d
12
可以map 一下heap么?确定一下。

【在 b******y 的大作中提到】
:
: 系统启动的时候,会将这个数组掉到内存里,就是initialize一下。但如果系统待命的
: 时间一长了,用户使用系统的时候,程序会再次调用这个数组,这个时候就发现系统会
: 很明显的慢一下。所以,可以肯定是因为操作系统把这个数组的内存区置换成了其他程
: 序的东西了。也就是被page out了。但,稍稍等一下后,系统反应又正常了。
: 就是说,不断load程序用到这个数组的时候,没事儿。但一旦中间间隔长了,程序空转
: ,没有用户使用,再次用到程序,就会有这个现象。

avatar
b*y
13

context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大
家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用
个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的
把地方腾出来。
总之,想听听这里的大牛们的意见和建议。
另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个
layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系
统的"任意胡为".
也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。

【在 l*******g 的大作中提到】
:
: 这个你要求有点怪。Java本身就是做到了与系统无关的设计,所以才有JVM这个东西,
: 如果,你需要这么细微的控制底层的东西,那你就不应该用Java来做。直接用C语言更
: 靠谱。
: 你最好能给出整个问题的context,这样也许大家可以更好地帮助你。你也可以选择去
: stackoverflow去问问,那里真正的牛人多。

avatar
x*d
14
我不太理解你们的流程,怎么走到这步的?我的理解,公司里干事,没有百分百的证据
说是你数组的写法不对,都不会让你考虑这么解决这个问题。加ram有多难?让程序员
改code够买n多ram了。
avatar
g*g
15
我从没有研究过这个问题,不过我想这个跟你的操作系统和你的GC参数有关。现在64位
,内存白菜价,
多开点内存,不应该是个问题才对。

【在 b******y 的大作中提到】
:
: context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大
: 家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用
: 个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的
: 把地方腾出来。
: 总之,想听听这里的大牛们的意见和建议。
: 另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个
: layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系
: 统的"任意胡为".
: 也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。

avatar
g*e
16
free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用
swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当
然你这种应该加内存了

西,
言更
择去

【在 b******y 的大作中提到】
:
: context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大
: 家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用
: 个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的
: 把地方腾出来。
: 总之,想听听这里的大牛们的意见和建议。
: 另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个
: layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系
: 统的"任意胡为".
: 也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。

avatar
g*e
17
另外我发现linux(redhat,不清楚其它OS),swap到硬盘上的内容,哪怕是后来物理内
存被释放有足够的空间,也不会被自动swap回来,必须等被访问之后才能重新换到物理
内存里。

上大
是用
动的
一个
作系

【在 g**e 的大作中提到】
: free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用
: swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当
: 然你这种应该加内存了
:
: 西,
: 言更
: 择去

avatar
b*y
18

不错,这个是我看到的最贴切的正解了,超级赞!
我们确实用的是redhat. 32 bit machine, 是个内部的demo server.
我这人喜欢用最少的资源做最多的事情,另外也喜欢刨根问底儿,所以有了这个问题后
,总想搞个水落石出,看看到底最佳方案是啥。
当然换64 bit machine加内存,都行了。但不搞清楚咋回事儿,不行。

【在 g**e 的大作中提到】
: 另外我发现linux(redhat,不清楚其它OS),swap到硬盘上的内容,哪怕是后来物理内
: 存被释放有足够的空间,也不会被自动swap回来,必须等被访问之后才能重新换到物理
: 内存里。
:
: 上大
: 是用
: 动的
: 一个
: 作系

avatar
b*y
19

那我们的production server(64 bits 很多内存),你觉得是否把swap关掉没啥坏处,
尽管内存足够用?谢,

【在 g**e 的大作中提到】
: free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用
: swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当
: 然你这种应该加内存了
:
: 西,
: 言更
: 择去

avatar
a*0
20
If linux, you can try huge pages, those will never be swapped out.
avatar
g*e
22
内存足够并且prod上有monitor/alarm检测内存使用的话,关掉swap是完全可以的。我
们production的机器默认就没有swap

【在 b******y 的大作中提到】
:
: 那我们的production server(64 bits 很多内存),你觉得是否把swap关掉没啥坏处,
: 尽管内存足够用?谢,

avatar
b*y
24

Looks like it.
另外,那篇文章的英文看着结结巴巴的,很不professional. 看着有些晕啊。我真有欲
望帮他改改。这种东西不敢用,像是个业余做的.

【在 g**e 的大作中提到】
: I believe this needs kernel support?
avatar
g*e
25
学习了一下,应该是没问题
http://www.oracle.com/technetwork/java/javase/tech/largememory-

【在 b******y 的大作中提到】
:
: Looks like it.
: 另外,那篇文章的英文看着结结巴巴的,很不professional. 看着有些晕啊。我真有欲
: 望帮他改改。这种东西不敢用,像是个业余做的.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。