b******y 发帖数: 9224 | 1 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了,
也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。
有啥办法能够keep这种数据在内存中吗?
我想了一些办法,不过也想听听版上大牛们的建议。 |
l*******g 发帖数: 82 | 2 做个singleton的class,里面放这个array。
比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但
如果有很长一段时间不reference这个数组了,貌似操作系统自动的........
【在 b******y 的大作中提到】 : 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但 : 如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了, : 也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。 : 有啥办法能够keep这种数据在内存中吗? : 我想了一些办法,不过也想听听版上大牛们的建议。
|
b******y 发帖数: 9224 | 3
不是singleton不singleton能解决的。是说,这个array太大了,jvm/operating
system会自动的放到disk去,如果数组很长时间没有被access话。
【在 l*******g 的大作中提到】 : 做个singleton的class,里面放这个array。 : : 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但 : 如果有很长一段时间不reference这个数组了,貌似操作系统自动的........
|
e*****t 发帖数: 1005 | 4 能确定到底是jvm还是os把内存swap出去了么?
jvm方面,不知道有什么办法。但是对于os,应该有办法把那些page pin在内存里吧。
【在 b******y 的大作中提到】 : : 不是singleton不singleton能解决的。是说,这个array太大了,jvm/operating : system会自动的放到disk去,如果数组很长时间没有被access话。
|
b******y 发帖数: 9224 | 5
恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天
(os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他
的好主意,我还没想到。
【在 e*****t 的大作中提到】 : 能确定到底是jvm还是os把内存swap出去了么? : jvm方面,不知道有什么办法。但是对于os,应该有办法把那些page pin在内存里吧。
|
n*****u 发帖数: 465 | 6 加个 low priority thread, 定期假装读这个大树组, keep its memory hot.
【在 b******y 的大作中提到】 : : 恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天 : (os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他 : 的好主意,我还没想到。
|
l*******g 发帖数: 82 | 7
这个你要求有点怪。Java本身就是做到了与系统无关的设计,所以才有JVM这个东西,
如果,你需要这么细微的控制底层的东西,那你就不应该用Java来做。直接用C语言更
靠谱。
你最好能给出整个问题的context,这样也许大家可以更好地帮助你。你也可以选择去
stackoverflow去问问,那里真正的牛人多。
【在 b******y 的大作中提到】 : : 恩,这个有些靠谱。我有查了查,c里面可以用mlock. 但java没有这个功能,只能听天 : (os)由命了。不过,我想可能需要用到jni, 或者是用unsafe. 反正不容易做了。其他 : 的好主意,我还没想到。
|
l******0 发帖数: 244 | 8 “如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了
,也就是,这个数组进了disk 缓存区了”
这个你是怎么判断出来的?
【在 b******y 的大作中提到】 : 比如说,内存里有个very big array of integers. 开始用这个array的时候还好,但 : 如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了, : 也就是,这个数组进了disk 缓存区了。所以,有时候再次调用数组的时候,很慢。 : 有啥办法能够keep这种数据在内存中吗? : 我想了一些办法,不过也想听听版上大牛们的建议。
|
b******y 发帖数: 9224 | 9
系统启动的时候,会将这个数组掉到内存里,就是initialize一下。但如果系统待命的
时间一长了,用户使用系统的时候,程序会再次调用这个数组,这个时候就发现系统会
很明显的慢一下。所以,可以肯定是因为操作系统把这个数组的内存区置换成了其他程
序的东西了。也就是被page out了。但,稍稍等一下后,系统反应又正常了。
就是说,不断load程序用到这个数组的时候,没事儿。但一旦中间间隔长了,程序空转
,没有用户使用,再次用到程序,就会有这个现象。
【在 l******0 的大作中提到】 : “如果有很长一段时间不reference这个数组了,貌似操作系统自动的把内存腾出来了 : ,也就是,这个数组进了disk 缓存区了” : 这个你是怎么判断出来的?
|
x****d 发帖数: 1766 | 10 可以map 一下heap么?确定一下。
【在 b******y 的大作中提到】 : : 系统启动的时候,会将这个数组掉到内存里,就是initialize一下。但如果系统待命的 : 时间一长了,用户使用系统的时候,程序会再次调用这个数组,这个时候就发现系统会 : 很明显的慢一下。所以,可以肯定是因为操作系统把这个数组的内存区置换成了其他程 : 序的东西了。也就是被page out了。但,稍稍等一下后,系统反应又正常了。 : 就是说,不断load程序用到这个数组的时候,没事儿。但一旦中间间隔长了,程序空转 : ,没有用户使用,再次用到程序,就会有这个现象。
|
|
|
b******y 发帖数: 9224 | 11
context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大
家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用
个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的
把地方腾出来。
总之,想听听这里的大牛们的意见和建议。
另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个
layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系
统的"任意胡为".
也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。
【在 l*******g 的大作中提到】 : : 这个你要求有点怪。Java本身就是做到了与系统无关的设计,所以才有JVM这个东西, : 如果,你需要这么细微的控制底层的东西,那你就不应该用Java来做。直接用C语言更 : 靠谱。 : 你最好能给出整个问题的context,这样也许大家可以更好地帮助你。你也可以选择去 : stackoverflow去问问,那里真正的牛人多。
|
x****d 发帖数: 1766 | 12 我不太理解你们的流程,怎么走到这步的?我的理解,公司里干事,没有百分百的证据
说是你数组的写法不对,都不会让你考虑这么解决这个问题。加ram有多难?让程序员
改code够买n多ram了。 |
g*****g 发帖数: 34805 | 13 我从没有研究过这个问题,不过我想这个跟你的操作系统和你的GC参数有关。现在64位
,内存白菜价,
多开点内存,不应该是个问题才对。
【在 b******y 的大作中提到】 : : context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大 : 家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用 : 个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的 : 把地方腾出来。 : 总之,想听听这里的大牛们的意见和建议。 : 另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个 : layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系 : 统的"任意胡为". : 也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。
|
g**e 发帖数: 6127 | 14 free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用
swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当
然你这种应该加内存了
西,
言更
择去
【在 b******y 的大作中提到】 : : context上面解释了一下。stackoverflow我在这里提问题之前已经去看过了,基本上大 : 家说的就是c里面可用mlock, 但java是无法将大数组保持在内存里的。有个办法就是用 : 个程序不断的去调用它,这样trick操作系统认为内存是不断被使用的,就不会自动的 : 把地方腾出来。 : 总之,想听听这里的大牛们的意见和建议。 : 另外,直接用C, 也不是说就可以保证物理内存是给你用的。因为有操作系统的这一个 : layer. 如果你不用mlock来lock住内存的话,普通C programming照样避免不了操作系 : 统的"任意胡为". : 也许这个就是现代编程的缺陷吧,你无法了解也无法掌控太低层的东西。
|
g**e 发帖数: 6127 | 15 另外我发现linux(redhat,不清楚其它OS),swap到硬盘上的内容,哪怕是后来物理内
存被释放有足够的空间,也不会被自动swap回来,必须等被访问之后才能重新换到物理
内存里。
上大
是用
动的
一个
作系
【在 g**e 的大作中提到】 : free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用 : swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当 : 然你这种应该加内存了 : : 西, : 言更 : 择去
|
b******y 发帖数: 9224 | 16
不错,这个是我看到的最贴切的正解了,超级赞!
我们确实用的是redhat. 32 bit machine, 是个内部的demo server.
我这人喜欢用最少的资源做最多的事情,另外也喜欢刨根问底儿,所以有了这个问题后
,总想搞个水落石出,看看到底最佳方案是啥。
当然换64 bit machine加内存,都行了。但不搞清楚咋回事儿,不行。
【在 g**e 的大作中提到】 : 另外我发现linux(redhat,不清楚其它OS),swap到硬盘上的内容,哪怕是后来物理内 : 存被释放有足够的空间,也不会被自动swap回来,必须等被访问之后才能重新换到物理 : 内存里。 : : 上大 : 是用 : 动的 : 一个 : 作系
|
b******y 发帖数: 9224 | 17
那我们的production server(64 bits 很多内存),你觉得是否把swap关掉没啥坏处,
尽管内存足够用?谢,
【在 g**e 的大作中提到】 : free -m看一下memory使用情况。这种情况一般来说是机器物理内存不够,OS开始使用 : swap space把cold data放到硬盘上了。我们production上的机器都把swap关掉的,当 : 然你这种应该加内存了 : : 西, : 言更 : 择去
|
a****0 发帖数: 51 | 18 If linux, you can try huge pages, those will never be swapped out. |
a****0 发帖数: 51 | |
g**e 发帖数: 6127 | 20 内存足够并且prod上有monitor/alarm检测内存使用的话,关掉swap是完全可以的。我
们production的机器默认就没有swap
【在 b******y 的大作中提到】 : : 那我们的production server(64 bits 很多内存),你觉得是否把swap关掉没啥坏处, : 尽管内存足够用?谢,
|
|
|
g**e 发帖数: 6127 | |
b******y 发帖数: 9224 | 22
Looks like it.
另外,那篇文章的英文看着结结巴巴的,很不professional. 看着有些晕啊。我真有欲
望帮他改改。这种东西不敢用,像是个业余做的.
【在 g**e 的大作中提到】 : I believe this needs kernel support?
|
g**e 发帖数: 6127 | 23 学习了一下,应该是没问题
http://www.oracle.com/technetwork/java/javase/tech/largememory-
【在 b******y 的大作中提到】 : : Looks like it. : 另外,那篇文章的英文看着结结巴巴的,很不professional. 看着有些晕啊。我真有欲 : 望帮他改改。这种东西不敢用,像是个业余做的.
|
b******y 发帖数: 9224 | |