今天我在尝试编年史地图。这是一个代码示例:
package experimental;
import net.openhft.chronicle.core.values.IntValue;
import net.openhft.chronicle.map.ChronicleMap;
import net.openhft.chronicle.values.Values;
public class Tmp {
public static void main(String[] args) {
try (ChronicleMap<IntValue, User> users = ChronicleMap
.of(IntValue.class, User.class)
.name("users")
.entries(100_000_000)
.create();) {
User user = Values.newHeapInstance(User.class);
IntValue id = Values.newHeapInstance(IntValue.class);
for (int i = 1; i < 100_000_000; i++) {
user.setId(i);
user.setBalance(Math.random() * 1_000_000);
id.setValue(i);
users.put(id, user);
if (i % 100 == 0) {
System.out.println(i + ". " +
users.values()
.stream()
.max(User::compareTo)
.map(User::getBalance)
.get());
}
}
}
}
public interface User extends Comparable<User> {
int getId();
void setId(int id);
double getBalance();
void setBalance(double balance);
@Override
default int compareTo(User other) {
return Double.compare(getBalance(), other.getBalance());
}
}
}
正如您在上面的代码中看到的,我只是创建用户对象并将其放入 Chronicle Map,并且在每 100 条记录之后,我只是打印具有最大余额的用户。但不幸的是,它正在产生一些垃圾。当我用 VisualVM 监控它时,我得到了以下信息:
似乎在 Chronicle Map 中使用流无论如何都会产生垃圾。
所以我的问题是:
* 这是否意味着我不应该将 Streams API 与 Chronicle Map 一起使用。
*还有其他解决方案/方法吗?
*如何以适当的方式过滤/搜索编年史地图,因为我有一些用例,而不仅仅是在其中放置/获取数据。