为什么总是"GC(分配失败)"?
用于linux-amd64 JRE(1.8.0_25 -b17)的Java HotSpot(TM)64位服务器VM(25.25- b02),
CommandLine flags:
-XX:CMSInitiatingOccupancyFraction=60
-XX:GCLogFileSize=10485760
-XX:+HeapDumpOnOutOfMemoryError
-XX:InitialHeapSize=32212254720
-XX:MaxHeapSize=32212254720
-XX:NewRatio=10
-XX:OldPLABSize=16
-XX:ParallelGCThreads=4
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintStringTableStatistics
-XX:+PrintTenuringDistribution
-XX:StringTableSize=1000003
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=50
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
Run Code Online (Sandbox Code Playgroud)
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age 1: 16885304 bytes, 16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]
28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15) …Run Code Online (Sandbox Code Playgroud) Google Guava教程称可以使用Ticker测试缓存过期
根据我的理解,我可以用它来强制快速过期.我是对的吗?
但我试过以下代码,它没有用,有什么建议吗?
@Test
public void expireAfterWriteTestWithTicker() throws InterruptedException {
Ticker t = new Ticker() {
@Override
public long read() {
return TimeUnit.MILLISECONDS.toNanos(5);
}
};
//Use ticker to force expire in 5 millseconds
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterWrite(20, TimeUnit.MINUTES).ticker(t).build(loader);
cache.getUnchecked("hello");
assertEquals(1, cache.size());
assertNotNull(cache.getIfPresent("hello"));
//sleep
Thread.sleep(10);
assertNull(cache.getIfPresent("hello")); //failed
}
Run Code Online (Sandbox Code Playgroud) 我使用elang ets表作为简单的缓存.我想使用进程扫描表并删除过期的元素(多个).
与ets:foldl
expire_table_example() ->
Tab = ets:new(ets_tab, [named_table, set]),
ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5},{f,7}]),
Tab1 = ets:foldl(fun({Key, Val}, Acc) ->
if
(Val > 3) -> [{Key, Val} | Acc];
true -> Acc
end
end, Tab, Tab),
io:format("end ~p ~n", [Tab1]).
Run Code Online (Sandbox Code Playgroud)
我有
[{f,7},{e,5},{d,4}|ets_tab] %% the ets_tab is NOT expected.
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
任何其他API会做得更好吗?
Erlang OTP表示gen_server:call同步并且gen_server:cast是异步的.
经过测试,我发现gen_server:call是同步的.但是,gen_server:cast 会将消息发送到邮箱,但并未同时运行任务.
如何创建多个进程来运行?
-module(example_gen).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).
-export([
add_bycall/2,
add_bycast/2
]).
-define(SERVER, ?MODULE).
-record(state, {}).
add_bycall(Key, Value) ->
gen_server:call(?SERVER, {bycall, Key, Value}).
add_bycast(Key, Value) ->
gen_server:cast(?SERVER, {bycast, Key, Value}).
example(Key, Value) ->
timer:sleep(2000),
io:format("finished [~p, ~p] at [~p] ~n", [Key, Value, erlang:system_time(milli_seconds)]).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
init([]) ->
{ok, #state{}}.
handle_call({bycall, Key, Value}, _From, State) ->
example(Key, Value),
{reply, …Run Code Online (Sandbox Code Playgroud) 我是Erlang新手.我有一个关于ets表的问题.
我有两个ets表,我需要插入或删除两者的值.
insert(V) ->
ets:insert(table_test,V),
ets:insert(table_cp,V).
delete(V)->
ets:delete(table_test,V),
ets:delete(table_cp,V).
Run Code Online (Sandbox Code Playgroud)
我怎样才能保证两者的操作成功或失败?
例如,插入操作,如果在ets上有错误:insert(table_cp,V),我应该从talbe_test中删除该值吗?
删除相同,如果ets:delete(table_cp,V)失败,我应该重新插入值吗?
请帮忙.
我需要从LIST中找到连续的相同元素.
从任何位置开始
即[BCCDAB]预期结果[cc] [BCDCBA]预期结果[]
有什么建议吗?谢谢