我创建了一个由大量元素组成的类数组,约有150M个元素,按照关键字排序(如下所述)。然后我建立了一个简单的http服务器,将每个请求反馈作为数组上的二分查找函数。 (我确定服务器的工作正常)。
数据初始化很好(当然非常缓慢)。预期的二分查找函数很快。
问题是:响应只是快了一段时间(10分钟,1小时……许多种时间范围),然后服务器需要相当长的时间(几分钟)才能对一个请求执行二分查找函数,然后它会迅速回来,一段时间后变慢......在它变慢时,我检查服务器状态(htop),似乎jvm正在进行GC。
当我将大型数组分割成较小的数组时,问题就不会发生,例如:10个包含15M元素的数组,我在搜索之前找到目标数组。因此,我猜测当我创建太大的数组时,JVM中发生了一些事情。
(编辑:我没有将大型数组拆分成片段的问题,因为我将“SiteInfo”对象实现为本机,从而减少了JVM中的大量对象。因此,问题是由我创建的太多对象引起的,请参见下面的答复,谢谢)
各位,你们对我的问题有什么想法吗?
(我发布了我的代码,其中有一些我认为并不重要的伪代码)
数据初始化很好(当然非常缓慢)。预期的二分查找函数很快。
问题是:响应只是快了一段时间(10分钟,1小时……许多种时间范围),然后服务器需要相当长的时间(几分钟)才能对一个请求执行二分查找函数,然后它会迅速回来,一段时间后变慢......在它变慢时,我检查服务器状态(htop),似乎jvm正在进行GC。
当我将大型数组分割成较小的数组时,问题就不会发生,例如:10个包含15M元素的数组,我在搜索之前找到目标数组。因此,我猜测当我创建太大的数组时,JVM中发生了一些事情。
(编辑:我没有将大型数组拆分成片段的问题,因为我将“SiteInfo”对象实现为本机,从而减少了JVM中的大量对象。因此,问题是由我创建的太多对象引起的,请参见下面的答复,谢谢)
各位,你们对我的问题有什么想法吗?
(我发布了我的代码,其中有一些我认为并不重要的伪代码)
public static class Token2TopSite implements Comparable<Token2TopSite> {
public final String token; // this is key for binary search
public final SiteInfo[] topSites; // just data, not important at this question, I think
public Token2TopSite(String token, SiteInfo[] topSites) {
this.token = token;
this.topSites = topSites;
}
@Override
public int compareTo(Token2TopSite o) {
return token.compareTo(o.token);
}
public static void main(String[] args) {
Token2TopSite[] array = new Token2TopSite[150 * 1000000];
...; // init data for array, this runs properly
Arrays.sort(array);
startServerOnArray(array); // each request is a element search on the array
}
}