由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - java如何keep大数组在内存中?
相关主题
Alternative way to swap Integer[合集] Java sucks big time for no hot swap.
问个系统问题 (转载)Java6里面int跟Integer已经实现了自动转换?
java: use vector to shuffle a deck of Card 问题 (转载)哪位大牛帮帮忙, 初学JAVA, 问题一道
看到一个关于singleton的面试题Why System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?
问个数组问题昨天面试的一道题
Re: for help今天被老印grill了
How to check if an element is in an array?今天碰到一个面试题
关于数组的内存Converge of languages and design pattern
相关话题的讨论汇总
话题: 内存话题: 数组话题: array话题: 操作系统话题: swap
进入Java版参与讨论
1 (共1页)
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程序用到这个数组的时候,没事儿。但一旦中间间隔长了,程序空转
: ,没有用户使用,再次用到程序,就会有这个现象。

相关主题
Re: for help[合集] Java sucks big time for no hot swap.
How to check if an element is in an array?Java6里面int跟Integer已经实现了自动转换?
关于数组的内存哪位大牛帮帮忙, 初学JAVA, 问题一道
进入Java版参与讨论
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关掉没啥坏处,
: 尽管内存足够用?谢,

相关主题
Why System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?今天碰到一个面试题
昨天面试的一道题Converge of languages and design pattern
今天被老印grill了Integer in heap
进入Java版参与讨论
g**e
发帖数: 6127
21
I believe this needs kernel support?

【在 a****0 的大作中提到】
: http://dino.ciuffetti.info/2011/07/howto-java-huge-pages-linux/
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
24

真有你的,也co-学习了一下,8错。

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

1 (共1页)
进入Java版参与讨论
相关主题
Converge of languages and design pattern问个数组问题
Integer in heapRe: for help
a fun coding questionHow to check if an element is in an array?
出个简单题,看你Java APi熟悉到什么程度关于数组的内存
Alternative way to swap Integer[合集] Java sucks big time for no hot swap.
问个系统问题 (转载)Java6里面int跟Integer已经实现了自动转换?
java: use vector to shuffle a deck of Card 问题 (转载)哪位大牛帮帮忙, 初学JAVA, 问题一道
看到一个关于singleton的面试题Why System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?
相关话题的讨论汇总
话题: 内存话题: 数组话题: array话题: 操作系统话题: swap