有很多关于堆大小的帖子和站点,但是他们都没有提到如何找出我在调用jvm时可以保留的最大可能堆大小.
任务是以最大可用堆大小xmx = max动态启动我的jvm(不需要在这里讨论这个任务的对象!).
人们会想到读取当前可用或可用的内存并将该大小用于xms和xmx.但这不起作用.
例如在64位计算机和Windows操作系统上,24GB内存,可用虚拟内存大约1.8 GB :(这些由c#确定,在执行过程中执行Java命令)
jvm推出32位!根据其他网站和帖子的说法:64位操作系统上32位JVM的最大Java堆大小应该在1.4GB以上.
[09.07.2015 08:39:39] Total physical memory MB: 24002
[09.07.2015 08:39:39] Available physical memory MB: 16115
[09.07.2015 08:39:39] Total virtual memory MB: 2047
[09.07.2015 08:39:39] Available virtual memory MB: 1810
Run Code Online (Sandbox Code Playgroud)
用以下方法调用Java程序:
java -Xms1536m -Xmx1536m myApp
导致:
无法为1572864KB对象堆保留足够的空间
同样一直到1136米,这是最大的可能!
因此我的问题:如何预先检查堆大小可能调用jvm,而不试用错误?
UDPATE:根据这些评论,我提出了另一个问题,那就是那些Pro:你们如何运行Java应用程序?
我对你的答案非常好奇!
在Solr 6.6.2上进行以下设置:
Solr云集合,其文档具有字段ID,ContactId,属性启动和运行以及id上的唯一键.
可以有多个具有相同ContactId的文档.
每个联系人文档都有一个包含一行文本的文本字段属性.属性字段使用','分隔索引,例如属性:绿色命中.
例如:
+----+-----------+--------------+
| ID | ContactId | Properties |
+----+-----------+--------------+
| 1 | C1 | Blue,Green |
| 2 | C1 | Blue,Yellow |
| 3 | C2 | Green,Yellow |
+----+-----------+--------------+
Run Code Online (Sandbox Code Playgroud)
现在我需要找到所有ContactIds,其中Properties具有"Green"和"Yellow",允许此查询匹配此ContactID的所有文档.因此结果将是C1,C2.
我试图对结果进行分组,但我仍然无法查询分组结果.
group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow)
Run Code Online (Sandbox Code Playgroud)
我遵循的想法是查询(q)获取所有具有绿色或黄色的文档,而不是组中的分组.字段ContactId,然后是具有AND条件绿色和黄色的group.query.但那并没有成功.
在mySql中,只需要一个
group_concat(Properties) as grouped
Run Code Online (Sandbox Code Playgroud)
并对该字符串执行类似操作:
grouped LIKE '%Green%' AND grouped LIKE '%Yellow%'
Run Code Online (Sandbox Code Playgroud)
如何在Solr索引上实现此查询?
到目前为止尝试引用和没有:
intersect(
search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"),
search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"),
on="ContactId" )
Run Code Online (Sandbox Code Playgroud)
派生自solr的例子:
intersect(
search(w3, q=Properties:("Green" OR "Green" AND "Yellow"), …Run Code Online (Sandbox Code Playgroud) 虽然这段代码正在运行,但它仍然在研磨我的齿轮:
public static <K, V> Map<K, V> entityListToIdMap(List<? extends BaseEntity<K>> list, Class<K> keyClass) {
Map<K, V> map = new TreeMap<K, V>();
if(list != null){
for (BaseEntity<K> item : list) {
map.put(item.getId(), (V) item);
}
}
return map;
}
Run Code Online (Sandbox Code Playgroud)
我所缺少的是,告诉方法签名,V extends BaseEntity<K>.这也可能导致未经检查的警告,这使得必须将值中的项目转换为V.
我怎么能V说它必须extend BaseEntity<K>?
基于@Ori Lentz接受的答案,完整的解决方案:
public static <K, V extends BaseEntity<K>> Map<K, V> entityListToIdMap(List<V> list, Class<K> keyClass) {
Map<K, V> map = new TreeMap<K, V>();
if (list != null) {
for (V item …Run Code Online (Sandbox Code Playgroud)