Skip to main content

100 posts tagged with "java"

View All Tags

redission 调用流程

· 8 min read

背景​

java的redis操作使用redission封装

一个简单的堆栈堆栈

使用​

比较核心的堆栈

encode:132, CommandEncoder (org.redisson.client.handler)
encode:99, CommandEncoder (org.redisson.client.handler)
encode:55, CommandEncoder (org.redisson.client.handler)
write:107, MessageToByteEncoder (io.netty.handler.codec)
write:75, CommandEncoder (org.redisson.client.handler)
invokeWrite0:881, AbstractChannelHandlerContext (io.netty.channel)
invokeWrite:863, AbstractChannelHandlerContext (io.netty.channel)
write:968, AbstractChannelHandlerContext (io.netty.channel)
write:856, AbstractChannelHandlerContext (io.netty.channel)
write:120, MessageToByteEncoder (io.netty.handler.codec)
write:45, CommandBatchEncoder (org.redisson.client.handler)
invokeWrite0:881, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:940, AbstractChannelHandlerContext (io.netty.channel)
write:966, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
write:83, CommandsQueue (org.redisson.client.handler)
invokeWrite0:879, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:940, AbstractChannelHandlerContext (io.netty.channel)
run:1247, AbstractChannelHandlerContext$WriteTask (io.netty.channel)
runTask$$$capture:174, AbstractEventExecutor (io.netty.util.concurrent)
runTask:-1, AbstractEventExecutor (io.netty.util.concurrent)
- Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:836, SingleThreadEventExecutor (io.netty.util.concurrent)
execute0:827, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:817, SingleThreadEventExecutor (io.netty.util.concurrent)
safeExecute:1165, AbstractChannelHandlerContext (io.netty.channel)
write:972, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:984, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:1025, DefaultChannelPipeline (io.netty.channel)
writeAndFlush:306, AbstractChannel (io.netty.channel)
send:206, RedisConnection (org.redisson.client)
sendCommand:590, RedisExecutor (org.redisson.command)
lambda$execute$3:164, RedisExecutor (org.redisson.command)
uniWhenComplete:859, CompletableFuture (java.util.concurrent)
uniWhenCompleteStage:883, CompletableFuture (java.util.concurrent)
whenComplete:2251, CompletableFuture (java.util.concurrent)
execute:149, RedisExecutor (org.redisson.command)
async:526, CommandAsyncService (org.redisson.command)
writeAsync:490, CommandAsyncService (org.redisson.command)
setAsync:192, RedissonBucket (org.redisson)
set:183, RedissonBucket (org.redisson)
main:25, App (com.demo.redission)

分配内存​

allocateMemory:608, Unsafe (jdk.internal.misc)
<init>:122, DirectByteBuffer (java.nio)
allocateDirect:317, ByteBuffer (java.nio)
<clinit>:93, PlatformDependent0 (io.netty.util.internal)
isAndroid:333, PlatformDependent (io.netty.util.internal)
<clinit>:88, PlatformDependent (io.netty.util.internal)
<clinit>:84, NioEventLoop (io.netty.channel.nio)
newChild:182, NioEventLoopGroup (io.netty.channel.nio)
newChild:38, NioEventLoopGroup (io.netty.channel.nio)
<init>:84, MultithreadEventExecutorGroup (io.netty.util.concurrent)
<init>:60, MultithreadEventExecutorGroup (io.netty.util.concurrent)
<init>:49, MultithreadEventExecutorGroup (io.netty.util.concurrent)
<init>:59, MultithreadEventLoopGroup (io.netty.channel)
<init>:87, NioEventLoopGroup (io.netty.channel.nio)
<init>:82, NioEventLoopGroup (io.netty.channel.nio)
<init>:69, NioEventLoopGroup (io.netty.channel.nio)
<init>:181, MasterSlaveConnectionManager (org.redisson.connection)
<init>:73, ClusterConnectionManager (org.redisson.cluster)
createConnectionManager:196, ConfigSupport (org.redisson.config)
<init>:68, Redisson (org.redisson)
create:109, Redisson (org.redisson)
main:24, App (com.demo.redission)

ByteBuf 写入​

堆栈​

putByte:704, PlatformDependent0 (io.netty.util.internal)
putByte:719, PlatformDependent (io.netty.util.internal)
unsafeWriteUtf8:1020, ByteBufUtil (io.netty.buffer)
writeUtf8:836, ByteBufUtil (io.netty.buffer)
writeUtf8:820, ByteBufUtil (io.netty.buffer)
setCharSequence0:707, AbstractByteBuf (io.netty.buffer)
writeCharSequence:1187, AbstractByteBuf (io.netty.buffer)
encode:45, StringCodec$1 (org.redisson.client.codec)
encode:622, CommandAsyncService (org.redisson.command)
encode:313, RedissonObject (org.redisson)
setAsync:192, RedissonBucket (org.redisson)
set:183, RedissonBucket (org.redisson)
testApp:57, AppTest (com.demo.redission)
invokeVirtual:-1, LambdaForm$DMH/0x0000000800c0c400 (java.lang.invoke)
invoke:-1, LambdaForm$MH/0x0000000800c0d000 (java.lang.invoke)
invokeExact_MT:-1, Invokers$Holder (java.lang.invoke)
invokeImpl:154, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:104, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:577, Method (java.lang.reflect)
runTest:154, TestCase (junit.framework)
runBare:127, TestCase (junit.framework)
protect:106, TestResult$1 (junit.framework)
runProtected:124, TestResult (junit.framework)
run:109, TestResult (junit.framework)
run:118, TestCase (junit.framework)
doRun:116, TestRunner (junit.textui)
doRun:117, JUnit3IdeaTestRunner (com.intellij.junit3)
doRun:109, TestRunner (junit.textui)
startRunnerWithArgs:38, JUnit3IdeaTestRunner (com.intellij.junit3)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

ByteBuf 最后会调用UNSAFE.putByte(data, offset, value); 写入

ByteBuf 写入socket​

write:62, SocketDispatcher (sun.nio.ch)
writeFromNativeBuffer:137, IOUtil (sun.nio.ch)
write:81, IOUtil (sun.nio.ch)
write:58, IOUtil (sun.nio.ch)
write:532, SocketChannelImpl (sun.nio.ch)
doWrite:415, NioSocketChannel (io.netty.channel.socket.nio)
flush0:931, AbstractChannel$AbstractUnsafe (io.netty.channel)
flush0:354, AbstractNioChannel$AbstractNioUnsafe (io.netty.channel.nio)
flush:895, AbstractChannel$AbstractUnsafe (io.netty.channel)
flush:1372, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeFlush0:921, AbstractChannelHandlerContext (io.netty.channel)
invokeFlush:907, AbstractChannelHandlerContext (io.netty.channel)
flush:893, AbstractChannelHandlerContext (io.netty.channel)
flush:125, ChannelOutboundHandlerAdapter (io.netty.channel)
invokeFlush0:925, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:941, AbstractChannelHandlerContext (io.netty.channel)
write:966, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
write:83, CommandsQueue (org.redisson.client.handler)
invokeWrite0:879, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:940, AbstractChannelHandlerContext (io.netty.channel)
run:1247, AbstractChannelHandlerContext$WriteTask (io.netty.channel)
runTask$$$capture:174, AbstractEventExecutor (io.netty.util.concurrent)
runTask:-1, AbstractEventExecutor (io.netty.util.concurrent)
- Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:836, SingleThreadEventExecutor (io.netty.util.concurrent)
execute0:827, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:817, SingleThreadEventExecutor (io.netty.util.concurrent)
safeExecute:1165, AbstractChannelHandlerContext (io.netty.channel)
write:972, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:984, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:1025, DefaultChannelPipeline (io.netty.channel)
writeAndFlush:306, AbstractChannel (io.netty.channel)
send:206, RedisConnection (org.redisson.client)
sendCommand:590, RedisExecutor (org.redisson.command)
lambda$execute$3:164, RedisExecutor (org.redisson.command)
uniWhenComplete:863, CompletableFuture (java.util.concurrent)
uniWhenCompleteStage:887, CompletableFuture (java.util.concurrent)
whenComplete:2325, CompletableFuture (java.util.concurrent)
execute:149, RedisExecutor (org.redisson.command)
async:526, CommandAsyncService (org.redisson.command)
readAsync:292, CommandAsyncService (org.redisson.command)
getAsync:140, RedissonBucket (org.redisson)
get:135, RedissonBucket (org.redisson)
testApp:59, AppTest (com.demo.redission)
invoke:104, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:577, Method (java.lang.reflect)
runTest:154, TestCase (junit.framework)
runBare:127, TestCase (junit.framework)
protect:106, TestResult$1 (junit.framework)
runProtected:124, TestResult (junit.framework)
run:109, TestResult (junit.framework)
run:118, TestCase (junit.framework)
doRun:116, TestRunner (junit.textui)
doRun:117, JUnit3IdeaTestRunner (com.intellij.junit3)
doRun:109, TestRunner (junit.textui)
startRunnerWithArgs:38, JUnit3IdeaTestRunner (com.intellij.junit3)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

ByteBuf 到ByteBuffer 转换​

    public ByteBuffer[] nioBuffers(int maxCount, long maxBytes) {
...
ByteBuffer[] nioBuffers = NIO_BUFFERS.get(threadLocalMap);
Entry entry = flushedEntry;
while (isFlushedEntry(entry) && entry.msg instanceof ByteBuf) {
if (!entry.cancelled) {
ByteBuf buf = (ByteBuf) entry.msg;
final int readerIndex = buf.readerIndex();
final int readableBytes = buf.writerIndex() - readerIndex;

if (readableBytes > 0) {
nioBufferSize += readableBytes;
int count = entry.count;
if (count == -1) {
//noinspection ConstantValueVariableUse
entry.count = count = buf.nioBufferCount();
}
int neededSpace = min(maxCount, nioBufferCount + count);
if (neededSpace > nioBuffers.length) {
nioBuffers = expandNioBufferArray(nioBuffers, neededSpace, nioBufferCount);
NIO_BUFFERS.set(threadLocalMap, nioBuffers);
}
if (count == 1) {
ByteBuffer nioBuf = entry.buf;
if (nioBuf == null) {
// cache ByteBuffer as it may need to create a new ByteBuffer instance if its a
// derived buffer
entry.buf = nioBuf = buf.internalNioBuffer(readerIndex, readableBytes); // 转换
}
nioBuffers[nioBufferCount++] = nioBuf;
} else {
// The code exists in an extra method to ensure the method is not too big to inline as this
// branch is not very likely to get hit very frequently.
nioBufferCount = nioBuffers(entry, buf, nioBuffers, nioBufferCount, maxCount); // 转换nioBuffers
}
if (nioBufferCount >= maxCount) {
break;
}
}
}
entry = entry.next;
}
this.nioBufferCount = nioBufferCount;
this.nioBufferSize = nioBufferSize;

return nioBuffers;
}

写入ByteBuf 转换到ByteBuffer 的过程, 最后调用的是PooledByteBuf.internalNioBuffer 这个方法

internalNioBuffer:158, PooledByteBuf (io.netty.buffer)
_internalNioBuffer:194, PooledByteBuf (io.netty.buffer)
internalNioBuffer:207, PooledByteBuf (io.netty.buffer)
nioBuffers:447, ChannelOutboundBuffer (io.netty.channel)
doWrite:399, NioSocketChannel (io.netty.channel.socket.nio)
flush0:931, AbstractChannel$AbstractUnsafe (io.netty.channel)
flush0:354, AbstractNioChannel$AbstractNioUnsafe (io.netty.channel.nio)
flush:895, AbstractChannel$AbstractUnsafe (io.netty.channel)
flush:1372, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeFlush0:921, AbstractChannelHandlerContext (io.netty.channel)
invokeFlush:907, AbstractChannelHandlerContext (io.netty.channel)
flush:893, AbstractChannelHandlerContext (io.netty.channel)
flush:125, ChannelOutboundHandlerAdapter (io.netty.channel)
invokeFlush0:925, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:941, AbstractChannelHandlerContext (io.netty.channel)
write:966, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
write:83, CommandsQueue (org.redisson.client.handler)
invokeWrite0:879, AbstractChannelHandlerContext (io.netty.channel)
invokeWriteAndFlush:940, AbstractChannelHandlerContext (io.netty.channel)
run:1247, AbstractChannelHandlerContext$WriteTask (io.netty.channel)
runTask$$$capture:174, AbstractEventExecutor (io.netty.util.concurrent)
runTask:-1, AbstractEventExecutor (io.netty.util.concurrent)
- Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:836, SingleThreadEventExecutor (io.netty.util.concurrent)
execute0:827, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:817, SingleThreadEventExecutor (io.netty.util.concurrent)
safeExecute:1165, AbstractChannelHandlerContext (io.netty.channel)
write:972, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:934, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:984, AbstractChannelHandlerContext (io.netty.channel)
writeAndFlush:1025, DefaultChannelPipeline (io.netty.channel)
writeAndFlush:306, AbstractChannel (io.netty.channel)
send:206, RedisConnection (org.redisson.client)
sync:215, RedisConnection (org.redisson.client)
sync:202, RedisConnection (org.redisson.client)
<init>:100, ClusterConnectionManager (org.redisson.cluster)
createConnectionManager:196, ConfigSupport (org.redisson.config)
<init>:68, Redisson (org.redisson)
create:109, Redisson (org.redisson)
main:24, App (com.demo.redission)

创建链接的过程:

createConnection:36, RedisConnectionHandler (org.redisson.client.handler)
channelRegistered:53, BaseConnectionHandler (org.redisson.client.handler)
invokeChannelRegistered:176, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRegistered:152, AbstractChannelHandlerContext (io.netty.channel) [2]
fireChannelRegistered:145, AbstractChannelHandlerContext (io.netty.channel)
channelRegistered:1383, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRegistered:172, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRegistered:152, AbstractChannelHandlerContext (io.netty.channel) [1]
fireChannelRegistered:815, DefaultChannelPipeline (io.netty.channel)
register0:517, AbstractChannel$AbstractUnsafe (io.netty.channel)
access$200:429, AbstractChannel$AbstractUnsafe (io.netty.channel)
run:486, AbstractChannel$AbstractUnsafe$1 (io.netty.channel)
runTask$$$capture:174, AbstractEventExecutor (io.netty.util.concurrent)
runTask:-1, AbstractEventExecutor (io.netty.util.concurrent)
- Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:836, SingleThreadEventExecutor (io.netty.util.concurrent)
execute0:827, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:817, SingleThreadEventExecutor (io.netty.util.concurrent)
register:483, AbstractChannel$AbstractUnsafe (io.netty.channel)
register:89, SingleThreadEventLoop (io.netty.channel)
register:83, SingleThreadEventLoop (io.netty.channel)
register:86, MultithreadEventLoopGroup (io.netty.channel)
initAndRegister:323, AbstractBootstrap (io.netty.bootstrap)
doResolveAndConnect:155, Bootstrap (io.netty.bootstrap)
connect:139, Bootstrap (io.netty.bootstrap)
lambda$connectAsync$1:220, RedisClient (org.redisson.client)
uniComposeStage:1187, CompletableFuture (java.util.concurrent)
thenCompose:2309, CompletableFuture (java.util.concurrent)
connectAsync:218, RedisClient (org.redisson.client)
connect:189, ClientConnectionsEntry (org.redisson.connection)
connect:249, ConnectionPool (org.redisson.connection.pool)
createConnection:274, ConnectionPool (org.redisson.connection.pool)
lambda$createConnection$1:112, ConnectionPool (org.redisson.connection.pool)
uniAcceptNow:757, CompletableFuture (java.util.concurrent)
uniAcceptStage:735, CompletableFuture (java.util.concurrent)
thenAccept:2182, CompletableFuture (java.util.concurrent)
createConnection:110, ConnectionPool (org.redisson.connection.pool)
initConnections:92, ConnectionPool (org.redisson.connection.pool)
add:69, ConnectionPool (org.redisson.connection.pool)
add:34, MasterConnectionPool (org.redisson.connection.pool)
lambda$setupMasterEntry$1:139, MasterSlaveEntry (org.redisson.connection)
uniComposeStage:1187, CompletableFuture (java.util.concurrent)
thenCompose:2309, CompletableFuture (java.util.concurrent)
setupMasterEntry:122, MasterSlaveEntry (org.redisson.connection)
setupMasterEntry:117, MasterSlaveEntry (org.redisson.connection)
setupMasterEntry:112, MasterSlaveEntry (org.redisson.connection)
initSingleEntry:330, MasterSlaveConnectionManager (org.redisson.connection)
<init>:146, MasterSlaveConnectionManager (org.redisson.connection)
<init>:30, SingleConnectionManager (org.redisson.connection)
createConnectionManager:190, ConfigSupport (org.redisson.config)
<init>:68, Redisson (org.redisson)
create:109, Redisson (org.redisson)
testApp:58, AppTest (com.demo.redission)
invoke:104, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:577, Method (java.lang.reflect)
runTest:154, TestCase (junit.framework)
runBare:127, TestCase (junit.framework)
protect:106, TestResult$1 (junit.framework)
runProtected:124, TestResult (junit.framework)
run:109, TestResult (junit.framework)
run:118, TestCase (junit.framework)
doRun:116, TestRunner (junit.textui)
doRun:117, JUnit3IdeaTestRunner (com.intellij.junit3)
doRun:109, TestRunner (junit.textui)
startRunnerWithArgs:38, JUnit3IdeaTestRunner (com.intellij.junit3)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

Bootstrap使用:

createBootstrap:122, RedisClient (org.redisson.client)
<init>:115, RedisClient (org.redisson.client)
create:77, RedisClient (org.redisson.client)
createClient:425, MasterSlaveConnectionManager (org.redisson.connection)
createClient:412, MasterSlaveConnectionManager (org.redisson.connection)
setupMasterEntry:116, MasterSlaveEntry (org.redisson.connection)
setupMasterEntry:112, MasterSlaveEntry (org.redisson.connection)
initSingleEntry:330, MasterSlaveConnectionManager (org.redisson.connection)
<init>:146, MasterSlaveConnectionManager (org.redisson.connection)
<init>:30, SingleConnectionManager (org.redisson.connection)
createConnectionManager:190, ConfigSupport (org.redisson.config)
<init>:68, Redisson (org.redisson)
create:109, Redisson (org.redisson)
testApp:58, AppTest (com.demo.redission)
invokeVirtual:-1, LambdaForm$DMH/0x0000000800c0c400 (java.lang.invoke)
invoke:-1, LambdaForm$MH/0x0000000800c0d800 (java.lang.invoke)
invokeExact_MT:-1, Invokers$Holder (java.lang.invoke)
invokeImpl:154, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:104, DirectMethodHandleAccessor (jdk.internal.reflect)
invoke:577, Method (java.lang.reflect)
runTest:154, TestCase (junit.framework)
runBare:127, TestCase (junit.framework)
protect:106, TestResult$1 (junit.framework)
runProtected:124, TestResult (junit.framework)
run:109, TestResult (junit.framework)
run:118, TestCase (junit.framework)
runTest:208, TestSuite (junit.framework)
run:203, TestSuite (junit.framework)
doRun:116, TestRunner (junit.textui)
doRun:117, JUnit3IdeaTestRunner (com.intellij.junit3)
doRun:109, TestRunner (junit.textui)
startRunnerWithArgs:38, JUnit3IdeaTestRunner (com.intellij.junit3)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

future 使用:

handleResult:547, RedisExecutor (org.redisson.command)
checkAttemptPromise:524, RedisExecutor (org.redisson.command)
lambda$execute$4:176, RedisExecutor (org.redisson.command)
accept:-1, RedisExecutor$$Lambda$85/0x0000000800d64c28 (org.redisson.command)
uniWhenComplete:863, CompletableFuture (java.util.concurrent)
tryFire:841, CompletableFuture$UniWhenComplete (java.util.concurrent)
postComplete:510, CompletableFuture (java.util.concurrent)
complete:2147, CompletableFuture (java.util.concurrent)
completeResponse:467, CommandDecoder (org.redisson.client.handler)
handleResult:461, CommandDecoder (org.redisson.client.handler)
decode:340, CommandDecoder (org.redisson.client.handler)
decodeCommand:205, CommandDecoder (org.redisson.client.handler)
decode:144, CommandDecoder (org.redisson.client.handler)
decode:120, CommandDecoder (org.redisson.client.handler)
decodeRemovalReentryProtection:529, ByteToMessageDecoder (io.netty.handler.codec)
callDecode:366, ReplayingDecoder (io.netty.handler.codec)
channelRead:290, ByteToMessageDecoder (io.netty.handler.codec)
invokeChannelRead:444, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRead:420, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRead:412, AbstractChannelHandlerContext (io.netty.channel)
channelRead:1410, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRead:440, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRead:420, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRead:919, DefaultChannelPipeline (io.netty.channel)
read:166, AbstractNioByteChannel$NioByteUnsafe (io.netty.channel.nio)
processSelectedKey:788, NioEventLoop (io.netty.channel.nio)
processSelectedKeysOptimized:724, NioEventLoop (io.netty.channel.nio)
processSelectedKeys:650, NioEventLoop (io.netty.channel.nio)
run:562, NioEventLoop (io.netty.channel.nio)
run:997, SingleThreadEventExecutor$4 (io.netty.util.concurrent)
run:74, ThreadExecutorMap$2 (io.netty.util.internal)
run:30, FastThreadLocalRunnable (io.netty.util.concurrent)
run:833, Thread (java.lang)

redis 解码

/home/dai/.m2/repository/org/redisson/redisson/3.19.0/redisson-3.19.0-sources.jar!/org/redisson/client/handler/RedisChannelInitializer.java
@Override
protected void initChannel(Channel ch) throws Exception {
initSsl(config, ch);

if (type == Type.PLAIN) {
ch.pipeline().addLast(new RedisConnectionHandler(redisClient));
} else {
ch.pipeline().addLast(new RedisPubSubConnectionHandler(redisClient));
}

ch.pipeline().addLast(
connectionWatchdog,
CommandEncoder.INSTANCE,
CommandBatchEncoder.INSTANCE);

if (type == Type.PLAIN) {
ch.pipeline().addLast(new CommandsQueue());
} else {
ch.pipeline().addLast(new CommandsQueuePubSub());
}

if (pingConnectionHandler != null) {
ch.pipeline().addLast(pingConnectionHandler);
}

if (type == Type.PLAIN) {
ch.pipeline().addLast(new CommandDecoder(config.getAddress().getScheme())); // 解码
} else {
ch.pipeline().addLast(new CommandPubSubDecoder(config));
}

ch.pipeline().addLast(new ErrorsLoggingHandler());

config.getNettyHook().afterChannelInitialization(ch);
}

redission future 回调:

handleResult:547, RedisExecutor (org.redisson.command)
checkAttemptPromise:524, RedisExecutor (org.redisson.command)
lambda$execute$4:176, RedisExecutor (org.redisson.command)
accept:-1, RedisExecutor$$Lambda$86/0x0000000800d64c18 (org.redisson.command)
uniWhenComplete:863, CompletableFuture (java.util.concurrent)
tryFire:841, CompletableFuture$UniWhenComplete (java.util.concurrent)
postComplete:510, CompletableFuture (java.util.concurrent)
complete:2147, CompletableFuture (java.util.concurrent)
completeResponse:467, CommandDecoder (org.redisson.client.handler)
handleResult:461, CommandDecoder (org.redisson.client.handler)
decode:392, CommandDecoder (org.redisson.client.handler)
decodeCommand:205, CommandDecoder (org.redisson.client.handler)
decode:144, CommandDecoder (org.redisson.client.handler)
decode:120, CommandDecoder (org.redisson.client.handler)
decodeRemovalReentryProtection:529, ByteToMessageDecoder (io.netty.handler.codec)
callDecode:366, ReplayingDecoder (io.netty.handler.codec)
channelRead:290, ByteToMessageDecoder (io.netty.handler.codec)
invokeChannelRead:444, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRead:420, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRead:412, AbstractChannelHandlerContext (io.netty.channel)
channelRead:1410, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRead:440, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRead:420, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRead:919, DefaultChannelPipeline (io.netty.channel)
read:166, AbstractNioByteChannel$NioByteUnsafe (io.netty.channel.nio)
processSelectedKey:788, NioEventLoop (io.netty.channel.nio)
processSelectedKeysOptimized:724, NioEventLoop (io.netty.channel.nio)
processSelectedKeys:650, NioEventLoop (io.netty.channel.nio)
run:562, NioEventLoop (io.netty.channel.nio)
run:997, SingleThreadEventExecutor$4 (io.netty.util.concurrent)
run:74, ThreadExecutorMap$2 (io.netty.util.internal)
run:30, FastThreadLocalRunnable (io.netty.util.concurrent)
run:833, Thread (java.lang)

相关阅读​

cms gc

· One min read

背景​

了解java 的cms gc 算法

路径​

src\hotspot\share\gc\serial\defNewGeneration.cpp
// Ignores "ref" and calls allocate().
oop Generation::promote(oop obj, size_t obj_size) {
assert(obj_size == obj->size(), "bad obj_size passed in");

#ifndef PRODUCT
if (GenCollectedHeap::heap()->promotion_should_fail()) {
return NULL;
}
#endif // #ifndef PRODUCT

HeapWord* result = allocate(obj_size, false);
if (result != NULL) {
Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(obj), result, obj_size);
return cast_to_oop(result);
} else {
GenCollectedHeap* gch = GenCollectedHeap::heap();
return gch->handle_failed_promotion(this, obj, obj_size);
}
}

相关阅读​

java基础

· One min read
  • 查看默认选项
$ java -XX:+PrintCommandLineFlags -version 
-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=525168320 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=8402693120 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment (build 17.0.5+8-Ubuntu-2ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.5+8-Ubuntu-2ubuntu122.04, mixed mode, sharing)

java io​

java 的io分字节流 : 字节流都是 inputStream/outPutStream 字符流: reader/writer

方向:

类名方法:读、写字节、字符
inputStreamreadbyte
outputStreamwritebyte
readerreadchar
writerwritechar

相关阅读​

java arraycopy

· 16 min read

背景​

了解arraycopy的实现,是浅拷贝还是深拷贝

arrays​

在了解arraycopy之前,先了解arrays

在jls里面有很详细的描述

In the Java programming language, arrays are objects (§4.3.1), are dynamically created
An array object contains a number of variables. The number of variables may be zero, in which case the array is said to be empty. The variables contained in an array have no names; instead they are referenced by array access expressions that use non-negative integer index values. These variables are called the components of the array. If an array has n components, we say n is the length of the array; the components of the array are referenced using integer indices from 0 to n - 1, inclusive.

arrays:

  • 类型:Object
  • arrays对象持有的是变量variables

变量 variables​

A variable is a storage location and has an associated type, sometimes called its compile-time type, that is either a primitive type (§4.2) or a reference type (§4.3).

A variable's value is changed by an assignment (§15.26) or by a prefix or postfix ++ (increment) or -- (decrement) operator (§15.14.2, §15.14.3, §15.15.1, §15.15.2).

variable 由两部分组成:

  • type
    • primitive type
    • reference type
  • value
    • primitive value
    • reference value
4.3.1 Objects
An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a
special null reference, which refers to no object.

jni 实现​

src\hotspot\share\oops\objArrayKlass.cpp

void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
int dst_pos, int length, TRAPS) {
assert(s->is_objArray(), "must be obj array");

if (!d->is_objArray()) {
ResourceMark rm(THREAD);
stringStream ss;
if (d->is_typeArray()) {
ss.print("arraycopy: type mismatch: can not copy object array[] into %s[]",
type2name_tab[ArrayKlass::cast(d->klass())->element_type()]);
} else {
ss.print("arraycopy: destination type %s is not an array", d->klass()->external_name());
}
THROW_MSG(vmSymbols::java_lang_ArrayStoreException(), ss.as_string());
}

// Check is all offsets and lengths are non negative
if (src_pos < 0 || dst_pos < 0 || length < 0) {
// Pass specific exception reason.
ResourceMark rm(THREAD);
stringStream ss;
if (src_pos < 0) {
ss.print("arraycopy: source index %d out of bounds for object array[%d]",
src_pos, s->length());
} else if (dst_pos < 0) {
ss.print("arraycopy: destination index %d out of bounds for object array[%d]",
dst_pos, d->length());
} else {
ss.print("arraycopy: length %d is negative", length);
}
THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), ss.as_string());
}
// Check if the ranges are valid
if ((((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) ||
(((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length())) {
// Pass specific exception reason.
ResourceMark rm(THREAD);
stringStream ss;
if (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) {
ss.print("arraycopy: last source index %u out of bounds for object array[%d]",
(unsigned int) length + (unsigned int) src_pos, s->length());
} else {
ss.print("arraycopy: last destination index %u out of bounds for object array[%d]",
(unsigned int) length + (unsigned int) dst_pos, d->length());
}
THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), ss.as_string());
}

// Special case. Boundary cases must be checked first
// This allows the following call: copy_array(s, s.length(), d.length(), 0).
// This is correct, since the position is supposed to be an 'in between point', i.e., s.length(),
// points to the right of the last element.
if (length==0) {
return;
}
if (UseCompressedOops) {
size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset<narrowOop>(src_pos);
size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset<narrowOop>(dst_pos);
assert(arrayOopDesc::obj_offset_to_raw<narrowOop>(s, src_offset, NULL) ==
objArrayOop(s)->obj_at_addr<narrowOop>(src_pos), "sanity");
assert(arrayOopDesc::obj_offset_to_raw<narrowOop>(d, dst_offset, NULL) ==
objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos), "sanity");
do_copy(s, src_offset, d, dst_offset, length, CHECK);
} else {
size_t src_offset = (size_t) objArrayOopDesc::obj_at_offset<oop>(src_pos);
size_t dst_offset = (size_t) objArrayOopDesc::obj_at_offset<oop>(dst_pos);
assert(arrayOopDesc::obj_offset_to_raw<oop>(s, src_offset, NULL) ==
objArrayOop(s)->obj_at_addr<oop>(src_pos), "sanity");
assert(arrayOopDesc::obj_offset_to_raw<oop>(d, dst_offset, NULL) ==
objArrayOop(d)->obj_at_addr<oop>(dst_pos), "sanity");
do_copy(s, src_offset, d, dst_offset, length, CHECK);
}
}
(gdb) bt
#0 Copy::conjoint_oops_atomic (count=6, to=0x62a434ee8, from=0x62a42f220) at /home/dai/jdk/src/hotspot/share/utilities/copy.hpp:164
#1 AccessInternal::arraycopy_conjoint_oops (src=0x62a42f220, dst=0x62a434ee8, length=6) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.cpp:94
#2 0x00007ffff7067317 in RawAccessBarrierArrayCopy::arraycopy<18112614ul, narrowOop> (length=6, dst_raw=<optimized out>, dst_offset_in_bytes=0, dst_obj=..., src_raw=0x62a42f220, src_offset_in_bytes=0,
src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.inline.hpp:270
#3 RawAccessBarrier<18112614ul>::arraycopy<narrowOop> (length=6, dst_raw=0x62a434ee8, dst_offset_in_bytes=0, dst_obj=..., src_raw=<optimized out>, src_offset_in_bytes=0, src_obj=...)
at /home/dai/jdk/src/hotspot/share/oops/accessBackend.inline.hpp:344
#4 RawAccessBarrier<18112614ul>::oop_arraycopy<narrowOop> (length=6, dst_raw=0x62a434ee8, dst_offset_in_bytes=0, dst_obj=..., src_raw=<optimized out>, src_offset_in_bytes=0, src_obj=...)
at /home/dai/jdk/src/hotspot/share/oops/accessBackend.inline.hpp:128
#5 ModRefBarrierSet::AccessBarrier<18112614ul, G1BarrierSet>::oop_arraycopy_in_heap<narrowOop> (length=6, dst_raw=0x62a434ee8, dst_offset_in_bytes=<optimized out>, dst_obj=...,
src_raw=<optimized out>, src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/gc/shared/modRefBarrierSet.inline.hpp:108
#6 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<18112614ul, G1BarrierSet>, (AccessInternal::BarrierType)8, 18112614ul>::oop_access_barrier<HeapWordImpl*> (src_obj=...,
src_offset_in_bytes=<optimized out>, src_raw=<optimized out>, dst_obj=..., dst_offset_in_bytes=<optimized out>, dst_raw=<optimized out>, length=6)
at /home/dai/jdk/src/hotspot/share/oops/access.inline.hpp:142
#7 0x00007ffff7063f43 in AccessInternal::RuntimeDispatch<18112582ul, HeapWordImpl*, (AccessInternal::BarrierType)8>::arraycopy_init (src_obj=..., src_offset_in_bytes=16, src_raw=0x0, dst_obj=...,
dst_offset_in_bytes=<optimized out>, dst_raw=<optimized out>, length=<optimized out>) at /home/dai/jdk/src/hotspot/share/oops/access.inline.hpp:339
#8 0x00007ffff7061a0e in AccessInternal::RuntimeDispatch<18112582ul, HeapWordImpl*, (AccessInternal::BarrierType)8>::arraycopy (length=<optimized out>, dst_raw=<optimized out>,
dst_offset_in_bytes=<optimized out>, dst_obj=..., src_raw=<optimized out>, src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.hpp:554
#9 AccessInternal::PreRuntimeDispatch::arraycopy<18112582ul, HeapWordImpl*> (length=<optimized out>, dst_raw=<optimized out>, dst_offset_in_bytes=<optimized out>, dst_obj=..., src_raw=<optimized out>,
src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.hpp:907
#10 AccessInternal::arraycopy_reduce_types<18112580ul> (length=<optimized out>, dst_raw=<optimized out>, dst_offset_in_bytes=<optimized out>, dst_obj=..., src_raw=<optimized out>,
src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.hpp:1054
#11 AccessInternal::arraycopy<18087940ul, HeapWordImpl*> (length=<optimized out>, dst_raw=<optimized out>, dst_offset_in_bytes=<optimized out>, dst_obj=..., src_raw=<optimized out>,
src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/accessBackend.hpp:1208
#12 Access<18087936ul>::oop_arraycopy<HeapWordImpl*> (length=<optimized out>, dst_raw=<optimized out>, dst_offset_in_bytes=<optimized out>, dst_obj=..., src_raw=<optimized out>,
src_offset_in_bytes=<optimized out>, src_obj=...) at /home/dai/jdk/src/hotspot/share/oops/access.hpp:137
#13 ArrayAccess<16777216ul>::oop_arraycopy (length=<optimized out>, dst_offset_in_bytes=<optimized out>, dst_obj=..., src_offset_in_bytes=<optimized out>, src_obj=...)
at /home/dai/jdk/src/hotspot/share/oops/access.hpp:323
#14 ObjArrayKlass::do_copy (this=this@entry=0x800058a00, s=..., src_offset=src_offset@entry=16, d=..., dst_offset=dst_offset@entry=16, length=length@entry=6, __the_thread__=0x7ffff0028f20)
at /home/dai/jdk/src/hotspot/share/oops/objArrayKlass.cpp:213
#15 0x00007ffff7062e33 in ObjArrayKlass::copy_array (this=0x800058a00, s=..., src_pos=<optimized out>, d=..., dst_pos=<optimized out>, length=6, __the_thread__=0x7ffff0028f20)
at /home/dai/jdk/src/hotspot/share/oops/oopsHierarchy.hpp:85
#16 0x00007ffff6b2d75f in JVM_ArrayCopy (env=<optimized out>, ignored=<optimized out>, src=<optimized out>, src_pos=0, dst=<optimized out>, dst_pos=0, length=6)
at /home/dai/jdk/src/hotspot/share/prims/jvm.cpp:298

x86的汇编代码如下src/hotspot/os_cpu/linux_x86/linux_x86_64.S

        # Support for void Copy::arrayof_conjoint_jlongs(jlong* from,
# jlong* to,
# size_t count)
# Equivalent to
# conjoint_jlongs_atomic
# arrayof_conjoint_oops
# conjoint_oops_atomic
#
# rdi - from
# rsi - to
# rdx - count, treated as ssize_t
#
.p2align 4,,15
.type _Copy_arrayof_conjoint_jlongs,@function
.type _Copy_conjoint_jlongs_atomic,@function
_Copy_arrayof_conjoint_jlongs:
_Copy_conjoint_jlongs_atomic:
cmpq %rdi,%rsi
leaq -8(%rdi,%rdx,8),%rax # from + count*8 - 8
jbe acl_CopyRight
cmpq %rax,%rsi
jbe acl_CopyLeft
acl_CopyRight:
leaq -8(%rsi,%rdx,8),%rcx # to + count*8 - 8
negq %rdx
jmp 3f
1: movq 8(%rax,%rdx,8),%rsi
movq %rsi,8(%rcx,%rdx,8)
addq $1,%rdx
jnz 1b
ret
.p2align 4,,15
2: movq -24(%rax,%rdx,8),%rsi
movq %rsi,-24(%rcx,%rdx,8)
movq -16(%rax,%rdx,8),%rsi
movq %rsi,-16(%rcx,%rdx,8)
movq -8(%rax,%rdx,8),%rsi
movq %rsi,-8(%rcx,%rdx,8)
movq (%rax,%rdx,8),%rsi
movq %rsi,(%rcx,%rdx,8)
3: addq $4,%rdx
jle 2b
subq $4,%rdx
jl 1b
ret
4: movq -8(%rdi,%rdx,8),%rcx
movq %rcx,-8(%rsi,%rdx,8)
subq $1,%rdx
jnz 4b
ret
.p2align 4,,15
5: movq 24(%rdi,%rdx,8),%rcx
movq %rcx,24(%rsi,%rdx,8)
movq 16(%rdi,%rdx,8),%rcx
movq %rcx,16(%rsi,%rdx,8)
movq 8(%rdi,%rdx,8),%rcx
movq %rcx,8(%rsi,%rdx,8)
movq (%rdi,%rdx,8),%rcx
movq %rcx,(%rsi,%rdx,8)
acl_CopyLeft:
subq $4,%rdx
jge 5b
addq $4,%rdx
jg 4b
ret

这里的文件jz jne 是相对段的偏移 , 然后试试编译成字节码之后看效果

这里的as是将汇编代码编译成二进制代码

$ as src/hotspot/os_cpu/linux_x86/linux_x86_64.S
$ objdump -S a.out

a.out: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <SpinPause>:
0: f3 90 pause
2: 48 c7 c0 01 00 00 00 mov $0x1,%rax
9: c3 ret
a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)

0000000000000010 <_Copy_arrayof_conjoint_bytes>:
10: 49 89 d0 mov %rdx,%r8
13: 48 c1 ea 03 shr $0x3,%rdx
17: 48 39 fe cmp %rdi,%rsi
1a: 4a 8d 44 07 ff lea -0x1(%rdi,%r8,1),%rax
1f: 76 09 jbe 2a <acb_CopyRight>
21: 48 39 c6 cmp %rax,%rsi
24: 0f 86 9e 00 00 00 jbe c8 <acb_CopyLeft>

000000000000002a <acb_CopyRight>:
2a: 48 8d 44 d7 f8 lea -0x8(%rdi,%rdx,8),%rax
2f: 48 8d 4c d6 f8 lea -0x8(%rsi,%rdx,8),%rcx
34: 48 f7 da neg %rdx
37: eb 7d jmp b6 <acb_CopyRight+0x8c>
39: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
40: 48 8b 74 d0 08 mov 0x8(%rax,%rdx,8),%rsi
45: 48 89 74 d1 08 mov %rsi,0x8(%rcx,%rdx,8)
4a: 48 83 c2 01 add $0x1,%rdx
4e: 75 f0 jne 40 <acb_CopyRight+0x16>
50: 49 f7 c0 04 00 00 00 test $0x4,%r8
57: 74 0e je 67 <acb_CopyRight+0x3d>
59: 8b 70 08 mov 0x8(%rax),%esi
5c: 89 71 08 mov %esi,0x8(%rcx)
5f: 48 83 c0 04 add $0x4,%rax
63: 48 83 c1 04 add $0x4,%rcx
67: 49 f7 c0 02 00 00 00 test $0x2,%r8
6e: 74 0c je 7c <acb_CopyRight+0x52>
70: 66 8b 70 08 mov 0x8(%rax),%si
74: 66 89 71 08 mov %si,0x8(%rcx)
78: 48 83 c1 02 add $0x2,%rcx
7c: 49 f7 c0 01 00 00 00 test $0x1,%r8
83: 74 08 je 8d <acb_CopyRight+0x63>
85: 42 8a 44 07 ff mov -0x1(%rdi,%r8,1),%al
8a: 88 41 08 mov %al,0x8(%rcx)
8d: c3 ret
8e: 66 90 xchg %ax,%ax
90: 48 8b 74 d0 e8 mov -0x18(%rax,%rdx,8),%rsi
95: 48 89 74 d1 e8 mov %rsi,-0x18(%rcx,%rdx,8)
9a: 48 8b 74 d0 f0 mov -0x10(%rax,%rdx,8),%rsi
9f: 48 89 74 d1 f0 mov %rsi,-0x10(%rcx,%rdx,8)
a4: 48 8b 74 d0 f8 mov -0x8(%rax,%rdx,8),%rsi
a9: 48 89 74 d1 f8 mov %rsi,-0x8(%rcx,%rdx,8)
ae: 48 8b 34 d0 mov (%rax,%rdx,8),%rsi
b2: 48 89 34 d1 mov %rsi,(%rcx,%rdx,8)
b6: 48 83 c2 04 add $0x4,%rdx
ba: 7e d4 jle 90 <acb_CopyRight+0x66>
bc: 48 83 ea 04 sub $0x4,%rdx
c0: 0f 8c 7a ff ff ff jl 40 <acb_CopyRight+0x16>
c6: eb 88 jmp 50 <acb_CopyRight+0x26>

00000000000000c8 <acb_CopyLeft>:
c8: 49 f7 c0 01 00 00 00 test $0x1,%r8
cf: 74 0e je df <acb_CopyLeft+0x17>
d1: 42 8a 4c 07 ff mov -0x1(%rdi,%r8,1),%cl
d6: 42 88 4c 06 ff mov %cl,-0x1(%rsi,%r8,1)
db: 49 83 e8 01 sub $0x1,%r8
df: 49 f7 c0 02 00 00 00 test $0x2,%r8
e6: 74 0c je f4 <acb_CopyLeft+0x2c>
e8: 66 42 8b 4c 07 fe mov -0x2(%rdi,%r8,1),%cx
ee: 66 42 89 4c 06 fe mov %cx,-0x2(%rsi,%r8,1)
f4: 49 f7 c0 04 00 00 00 test $0x4,%r8
fb: 74 59 je 156 <acb_CopyLeft+0x8e>
fd: 8b 0c d7 mov (%rdi,%rdx,8),%ecx
100: 89 0c d6 mov %ecx,(%rsi,%rdx,8)
103: eb 51 jmp 156 <acb_CopyLeft+0x8e>
105: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
10c: 00 00 00 00
110: 48 8b 4c d7 f8 mov -0x8(%rdi,%rdx,8),%rcx
115: 48 89 4c d6 f8 mov %rcx,-0x8(%rsi,%rdx,8)
11a: 48 83 ea 01 sub $0x1,%rdx
11e: 75 f0 jne 110 <acb_CopyLeft+0x48>
120: c3 ret
121: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
128: 00 00 00 00
12c: 0f 1f 40 00 nopl 0x0(%rax)
130: 48 8b 4c d7 18 mov 0x18(%rdi,%rdx,8),%rcx
135: 48 89 4c d6 18 mov %rcx,0x18(%rsi,%rdx,8)
13a: 48 8b 4c d7 10 mov 0x10(%rdi,%rdx,8),%rcx
13f: 48 89 4c d6 10 mov %rcx,0x10(%rsi,%rdx,8)
144: 48 8b 4c d7 08 mov 0x8(%rdi,%rdx,8),%rcx
149: 48 89 4c d6 08 mov %rcx,0x8(%rsi,%rdx,8)
14e: 48 8b 0c d7 mov (%rdi,%rdx,8),%rcx
152: 48 89 0c d6 mov %rcx,(%rsi,%rdx,8)
156: 48 83 ea 04 sub $0x4,%rdx
15a: 7d d4 jge 130 <acb_CopyLeft+0x68>
15c: 48 83 c2 04 add $0x4,%rdx
160: 7f ae jg 110 <acb_CopyLeft+0x48>
162: c3 ret
163: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
16a: 00 00 00 00
16e: 66 90 xchg %ax,%ax

0000000000000170 <_Copy_arrayof_conjoint_jshorts>:
170: 49 89 d0 mov %rdx,%r8
173: 48 c1 ea 02 shr $0x2,%rdx
177: 48 39 fe cmp %rdi,%rsi
17a: 4a 8d 44 47 fe lea -0x2(%rdi,%r8,2),%rax
17f: 76 05 jbe 186 <acs_CopyRight>
181: 48 39 c6 cmp %rax,%rsi
184: 76 7e jbe 204 <acs_CopyLeft>

0000000000000186 <acs_CopyRight>:
186: 48 8d 44 d7 f8 lea -0x8(%rdi,%rdx,8),%rax
18b: 48 8d 4c d6 f8 lea -0x8(%rsi,%rdx,8),%rcx
190: 48 f7 da neg %rdx
193: eb 61 jmp 1f6 <acs_CopyRight+0x70>
195: 48 8b 74 d0 08 mov 0x8(%rax,%rdx,8),%rsi
19a: 48 89 74 d1 08 mov %rsi,0x8(%rcx,%rdx,8)
19f: 48 83 c2 01 add $0x1,%rdx
1a3: 75 f0 jne 195 <acs_CopyRight+0xf>
1a5: 49 f7 c0 02 00 00 00 test $0x2,%r8
1ac: 74 0a je 1b8 <acs_CopyRight+0x32>
1ae: 8b 70 08 mov 0x8(%rax),%esi
1b1: 89 71 08 mov %esi,0x8(%rcx)
1b4: 48 83 c1 04 add $0x4,%rcx
1b8: 49 f7 c0 01 00 00 00 test $0x1,%r8
1bf: 74 0a je 1cb <acs_CopyRight+0x45>
1c1: 66 42 8b 74 47 fe mov -0x2(%rdi,%r8,2),%si
1c7: 66 89 71 08 mov %si,0x8(%rcx)
1cb: c3 ret
1cc: 0f 1f 40 00 nopl 0x0(%rax)
1d0: 48 8b 74 d0 e8 mov -0x18(%rax,%rdx,8),%rsi
1d5: 48 89 74 d1 e8 mov %rsi,-0x18(%rcx,%rdx,8)
1da: 48 8b 74 d0 f0 mov -0x10(%rax,%rdx,8),%rsi
1df: 48 89 74 d1 f0 mov %rsi,-0x10(%rcx,%rdx,8)
1e4: 48 8b 74 d0 f8 mov -0x8(%rax,%rdx,8),%rsi
1e9: 48 89 74 d1 f8 mov %rsi,-0x8(%rcx,%rdx,8)
1ee: 48 8b 34 d0 mov (%rax,%rdx,8),%rsi
1f2: 48 89 34 d1 mov %rsi,(%rcx,%rdx,8)
1f6: 48 83 c2 04 add $0x4,%rdx
1fa: 7e d4 jle 1d0 <acs_CopyRight+0x4a>
1fc: 48 83 ea 04 sub $0x4,%rdx
200: 7c 93 jl 195 <acs_CopyRight+0xf>
202: eb a1 jmp 1a5 <acs_CopyRight+0x1f>

0000000000000204 <acs_CopyLeft>:
204: 49 f7 c0 01 00 00 00 test $0x1,%r8
20b: 74 0c je 219 <acs_CopyLeft+0x15>
20d: 66 42 8b 4c 47 fe mov -0x2(%rdi,%r8,2),%cx
213: 66 42 89 4c 46 fe mov %cx,-0x2(%rsi,%r8,2)
219: 49 f7 c0 02 00 00 00 test $0x2,%r8
220: 74 44 je 266 <acs_CopyLeft+0x62>
222: 8b 0c d7 mov (%rdi,%rdx,8),%ecx
225: 89 0c d6 mov %ecx,(%rsi,%rdx,8)
228: eb 3c jmp 266 <acs_CopyLeft+0x62>
22a: 48 8b 4c d7 f8 mov -0x8(%rdi,%rdx,8),%rcx
22f: 48 89 4c d6 f8 mov %rcx,-0x8(%rsi,%rdx,8)
234: 48 83 ea 01 sub $0x1,%rdx
238: 75 f0 jne 22a <acs_CopyLeft+0x26>
23a: c3 ret
23b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
240: 48 8b 4c d7 18 mov 0x18(%rdi,%rdx,8),%rcx
245: 48 89 4c d6 18 mov %rcx,0x18(%rsi,%rdx,8)
24a: 48 8b 4c d7 10 mov 0x10(%rdi,%rdx,8),%rcx
24f: 48 89 4c d6 10 mov %rcx,0x10(%rsi,%rdx,8)
254: 48 8b 4c d7 08 mov 0x8(%rdi,%rdx,8),%rcx
259: 48 89 4c d6 08 mov %rcx,0x8(%rsi,%rdx,8)
25e: 48 8b 0c d7 mov (%rdi,%rdx,8),%rcx
262: 48 89 0c d6 mov %rcx,(%rsi,%rdx,8)
266: 48 83 ea 04 sub $0x4,%rdx
26a: 7d d4 jge 240 <acs_CopyLeft+0x3c>
26c: 48 83 c2 04 add $0x4,%rdx
270: 7f b8 jg 22a <acs_CopyLeft+0x26>
272: c3 ret
273: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
27a: 00 00 00 00
27e: 66 90 xchg %ax,%ax

0000000000000280 <_Copy_arrayof_conjoint_jints>:
280: 49 89 d0 mov %rdx,%r8
283: 48 d1 ea shr %rdx
286: 48 39 fe cmp %rdi,%rsi
289: 4a 8d 44 87 fc lea -0x4(%rdi,%r8,4),%rax
28e: 76 05 jbe 295 <aci_CopyRight>
290: 48 39 c6 cmp %rax,%rsi
293: 76 6f jbe 304 <aci_CopyLeft>

0000000000000295 <aci_CopyRight>:
295: 48 8d 44 d7 f8 lea -0x8(%rdi,%rdx,8),%rax
29a: 48 8d 4c d6 f8 lea -0x8(%rsi,%rdx,8),%rcx
29f: 48 f7 da neg %rdx
2a2: eb 52 jmp 2f6 <aci_CopyRight+0x61>
2a4: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
2ab: 00 00 00 00
2af: 90 nop
2b0: 48 8b 74 d0 08 mov 0x8(%rax,%rdx,8),%rsi
2b5: 48 89 74 d1 08 mov %rsi,0x8(%rcx,%rdx,8)
2ba: 48 83 c2 01 add $0x1,%rdx
2be: 75 f0 jne 2b0 <aci_CopyRight+0x1b>
2c0: 49 f7 c0 01 00 00 00 test $0x1,%r8
2c7: 74 06 je 2cf <aci_CopyRight+0x3a>
2c9: 8b 70 08 mov 0x8(%rax),%esi
2cc: 89 71 08 mov %esi,0x8(%rcx)
2cf: c3 ret
2d0: 48 8b 74 d0 e8 mov -0x18(%rax,%rdx,8),%rsi
2d5: 48 89 74 d1 e8 mov %rsi,-0x18(%rcx,%rdx,8)
2da: 48 8b 74 d0 f0 mov -0x10(%rax,%rdx,8),%rsi
2df: 48 89 74 d1 f0 mov %rsi,-0x10(%rcx,%rdx,8)
2e4: 48 8b 74 d0 f8 mov -0x8(%rax,%rdx,8),%rsi
2e9: 48 89 74 d1 f8 mov %rsi,-0x8(%rcx,%rdx,8)
2ee: 48 8b 34 d0 mov (%rax,%rdx,8),%rsi
2f2: 48 89 34 d1 mov %rsi,(%rcx,%rdx,8)
2f6: 48 83 c2 04 add $0x4,%rdx
2fa: 7e d4 jle 2d0 <aci_CopyRight+0x3b>
2fc: 48 83 ea 04 sub $0x4,%rdx
300: 7c ae jl 2b0 <aci_CopyRight+0x1b>
302: eb bc jmp 2c0 <aci_CopyRight+0x2b>

0000000000000304 <aci_CopyLeft>:
304: 49 f7 c0 01 00 00 00 test $0x1,%r8
30b: 74 49 je 356 <aci_CopyLeft+0x52>
30d: 42 8b 4c 87 fc mov -0x4(%rdi,%r8,4),%ecx
312: 42 89 4c 86 fc mov %ecx,-0x4(%rsi,%r8,4)
317: eb 3d jmp 356 <aci_CopyLeft+0x52>
319: 48 8b 4c d7 f8 mov -0x8(%rdi,%rdx,8),%rcx
31e: 48 89 4c d6 f8 mov %rcx,-0x8(%rsi,%rdx,8)
323: 48 83 ea 01 sub $0x1,%rdx
327: 75 f0 jne 319 <aci_CopyLeft+0x15>
329: c3 ret
32a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
330: 48 8b 4c d7 18 mov 0x18(%rdi,%rdx,8),%rcx
335: 48 89 4c d6 18 mov %rcx,0x18(%rsi,%rdx,8)
33a: 48 8b 4c d7 10 mov 0x10(%rdi,%rdx,8),%rcx
33f: 48 89 4c d6 10 mov %rcx,0x10(%rsi,%rdx,8)
344: 48 8b 4c d7 08 mov 0x8(%rdi,%rdx,8),%rcx
349: 48 89 4c d6 08 mov %rcx,0x8(%rsi,%rdx,8)
34e: 48 8b 0c d7 mov (%rdi,%rdx,8),%rcx
352: 48 89 0c d6 mov %rcx,(%rsi,%rdx,8)
356: 48 83 ea 04 sub $0x4,%rdx
35a: 7d d4 jge 330 <aci_CopyLeft+0x2c>
35c: 48 83 c2 04 add $0x4,%rdx
360: 7f b7 jg 319 <aci_CopyLeft+0x15>
362: c3 ret
363: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
36a: 00 00 00 00
36e: 66 90 xchg %ax,%ax

0000000000000370 <_Copy_arrayof_conjoint_jlongs>:
370: 48 39 fe cmp %rdi,%rsi
373: 48 8d 44 d7 f8 lea -0x8(%rdi,%rdx,8),%rax
378: 76 09 jbe 383 <acl_CopyRight>
37a: 48 39 c6 cmp %rax,%rsi
37d: 0f 86 93 00 00 00 jbe 416 <acl_CopyLeft>

0000000000000383 <acl_CopyRight>:
383: 48 8d 4c d6 f8 lea -0x8(%rsi,%rdx,8),%rcx
388: 48 f7 da neg %rdx
38b: eb 39 jmp 3c6 <acl_CopyRight+0x43>
38d: 48 8b 74 d0 08 mov 0x8(%rax,%rdx,8),%rsi
392: 48 89 74 d1 08 mov %rsi,0x8(%rcx,%rdx,8)
397: 48 83 c2 01 add $0x1,%rdx
39b: 75 f0 jne 38d <acl_CopyRight+0xa>
39d: c3 ret
39e: 66 90 xchg %ax,%ax
3a0: 48 8b 74 d0 e8 mov -0x18(%rax,%rdx,8),%rsi
3a5: 48 89 74 d1 e8 mov %rsi,-0x18(%rcx,%rdx,8)
3aa: 48 8b 74 d0 f0 mov -0x10(%rax,%rdx,8),%rsi
3af: 48 89 74 d1 f0 mov %rsi,-0x10(%rcx,%rdx,8)
3b4: 48 8b 74 d0 f8 mov -0x8(%rax,%rdx,8),%rsi
3b9: 48 89 74 d1 f8 mov %rsi,-0x8(%rcx,%rdx,8)
3be: 48 8b 34 d0 mov (%rax,%rdx,8),%rsi
3c2: 48 89 34 d1 mov %rsi,(%rcx,%rdx,8)
3c6: 48 83 c2 04 add $0x4,%rdx
3ca: 7e d4 jle 3a0 <acl_CopyRight+0x1d>
3cc: 48 83 ea 04 sub $0x4,%rdx
3d0: 7c bb jl 38d <acl_CopyRight+0xa>
3d2: c3 ret
3d3: 48 8b 4c d7 f8 mov -0x8(%rdi,%rdx,8),%rcx
3d8: 48 89 4c d6 f8 mov %rcx,-0x8(%rsi,%rdx,8)
3dd: 48 83 ea 01 sub $0x1,%rdx
3e1: 75 f0 jne 3d3 <acl_CopyRight+0x50>
3e3: c3 ret
3e4: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
3eb: 00 00 00 00
3ef: 90 nop
3f0: 48 8b 4c d7 18 mov 0x18(%rdi,%rdx,8),%rcx
3f5: 48 89 4c d6 18 mov %rcx,0x18(%rsi,%rdx,8)
3fa: 48 8b 4c d7 10 mov 0x10(%rdi,%rdx,8),%rcx
3ff: 48 89 4c d6 10 mov %rcx,0x10(%rsi,%rdx,8)
404: 48 8b 4c d7 08 mov 0x8(%rdi,%rdx,8),%rcx
409: 48 89 4c d6 08 mov %rcx,0x8(%rsi,%rdx,8)
40e: 48 8b 0c d7 mov (%rdi,%rdx,8),%rcx
412: 48 89 0c d6 mov %rcx,(%rsi,%rdx,8)

0000000000000416 <acl_CopyLeft>:
416: 48 83 ea 04 sub $0x4,%rdx
41a: 7d d4 jge 3f0 <acl_CopyRight+0x6d>
41c: 48 83 c2 04 add $0x4,%rdx
420: 7f b1 jg 3d3 <acl_CopyRight+0x50>
422: c3 ret

总结​

arrays 包含一堆变量.变量有两种值:primitive值 , reference值.

所以copyarrays复制的是变量,也就是复制的是引用

Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array. A subsequence of array components are copied from the source array referenced by src to the destination array referenced by dest. The number of components copied is equal to the length argument. The components at positions srcPos through srcPos+length-1 in the source array are copied into positions destPos through destPos+length-1, respectively, of the destination array.

相关阅读​

rabbitmq spring boot

· 5 min read

背景​

了解springboot 的配置怎么加载的,了解spring-boot怎么读取rabbitmq配置的

堆栈​

spring boot 设置配置​

configure:40, SimpleRabbitListenerContainerFactoryConfigurer (org.springframework.boot.autoconfigure.amqp)
simpleRabbitListenerContainerFactory:81, RabbitAnnotationDrivenConfiguration (org.springframework.boot.autoconfigure.amqp)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
instantiate:154, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:652, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:637, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1555928242 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:755, SpringApplication (org.springframework.boot)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:402, SpringApplication (org.springframework.boot)
run:312, SpringApplication (org.springframework.boot)
loadContext:120, SpringBootContextLoader (org.springframework.boot.test.context)
loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
loadContext:124, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
getApplicationContext:123, DefaultTestContext (org.springframework.test.context.support)
setUpRequestContextIfNecessary:190, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:132, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:244, TestContextManager (org.springframework.test.context)
createTest:227, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runReflectiveCall:289, SpringJUnit4ClassRunner$1 (org.springframework.test.context.junit4)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
methodBlock:291, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:246, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:97, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:61, RunBeforeTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:70, RunAfterTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:190, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

设置属性​

configure:40, SimpleRabbitListenerContainerFactoryConfigurer (org.springframework.boot.autoconfigure.amqp)
simpleRabbitListenerContainerFactory:81, RabbitAnnotationDrivenConfiguration (org.springframework.boot.autoconfigure.amqp)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
instantiate:154, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:652, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:637, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 622043416 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:755, SpringApplication (org.springframework.boot)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:402, SpringApplication (org.springframework.boot)
run:312, SpringApplication (org.springframework.boot)
loadContext:120, SpringBootContextLoader (org.springframework.boot.test.context)
loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
loadContext:124, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
getApplicationContext:123, DefaultTestContext (org.springframework.test.context.support)
setUpRequestContextIfNecessary:190, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:132, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:244, TestContextManager (org.springframework.test.context)
createTest:227, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runReflectiveCall:289, SpringJUnit4ClassRunner$1 (org.springframework.test.context.junit4)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
methodBlock:291, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:246, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:97, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:61, RunBeforeTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:70, RunAfterTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:190, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

rabbitmq 配置注入​

<init>:57, RabbitAnnotationDrivenConfiguration (org.springframework.boot.autoconfigure.amqp)
newInstance0:-1, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:62, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (jdk.internal.reflect)
newInstance:490, Constructor (java.lang.reflect)
instantiateClass:204, BeanUtils (org.springframework.beans)
instantiate:117, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:310, ConstructorResolver (org.springframework.beans.factory.support)
autowireConstructor:295, ConstructorResolver (org.springframework.beans.factory.support)
autowireConstructor:1361, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1208, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 809260538 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:755, SpringApplication (org.springframework.boot)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:402, SpringApplication (org.springframework.boot)
run:312, SpringApplication (org.springframework.boot)
loadContext:120, SpringBootContextLoader (org.springframework.boot.test.context)
loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
loadContext:124, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
getApplicationContext:123, DefaultTestContext (org.springframework.test.context.support)
setUpRequestContextIfNecessary:190, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:132, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:244, TestContextManager (org.springframework.test.context)
createTest:227, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runReflectiveCall:289, SpringJUnit4ClassRunner$1 (org.springframework.test.context.junit4)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
methodBlock:291, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:246, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:97, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:61, RunBeforeTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:70, RunAfterTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:190, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

初始化空难的配置​

<init>:47, RabbitProperties (org.springframework.boot.autoconfigure.amqp)
newInstance0:-1, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:62, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (jdk.internal.reflect)
newInstance:490, Constructor (java.lang.reflect)
instantiateClass:204, BeanUtils (org.springframework.beans)
instantiate:87, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiateBean:1315, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1218, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:886, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:790, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:540, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:886, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:790, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:540, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveFieldValue:657, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1425, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveFieldValue:657, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1425, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:207, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveBeanByName:453, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
autowireResource:527, CommonAnnotationBeanPostProcessor (org.springframework.context.annotation)
getResource:497, CommonAnnotationBeanPostProcessor (org.springframework.context.annotation)
getResourceToInject:650, CommonAnnotationBeanPostProcessor$ResourceElement (org.springframework.context.annotation)
inject:228, InjectionMetadata$InjectedElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:318, CommonAnnotationBeanPostProcessor (org.springframework.context.annotation)
populateBean:1425, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 47925969 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$290)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:755, SpringApplication (org.springframework.boot)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:402, SpringApplication (org.springframework.boot)
run:312, SpringApplication (org.springframework.boot)
loadContext:120, SpringBootContextLoader (org.springframework.boot.test.context)
loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
loadContext:124, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
getApplicationContext:123, DefaultTestContext (org.springframework.test.context.support)
setUpRequestContextIfNecessary:190, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:132, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:244, TestContextManager (org.springframework.test.context)
createTest:227, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runReflectiveCall:289, SpringJUnit4ClassRunner$1 (org.springframework.test.context.junit4)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
methodBlock:291, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:246, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:97, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:61, RunBeforeTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:70, RunAfterTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:190, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

相关阅读​

nacos 获取配置

· 2 min read

背景​

nacos 是一个服务注册/发现中间件

获取配置的堆栈​

run:744, ClientWorker$ConfigRpcTransportClient$4 (com.alibaba.nacos.client.config.impl)
call:515, Executors$RunnableAdapter (java.util.concurrent)
run$$$capture:264, FutureTask (java.util.concurrent)
run:-1, FutureTask (java.util.concurrent)
- Async stack trace
<init>:151, FutureTask (java.util.concurrent)
<init>:215, ScheduledThreadPoolExecutor$ScheduledFutureTask (java.util.concurrent)
schedule:561, ScheduledThreadPoolExecutor (java.util.concurrent)
startInternal:739, ClientWorker$ConfigRpcTransportClient (com.alibaba.nacos.client.config.impl)
start:255, ConfigTransportClient (com.alibaba.nacos.client.config.impl)
<init>:472, ClientWorker (com.alibaba.nacos.client.config.impl)
<init>:81, NacosConfigService (com.alibaba.nacos.client.config)
newInstance0:-2, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:62, NativeConstructorAccessorImpl (jdk.internal.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (jdk.internal.reflect)
newInstance:490, Constructor (java.lang.reflect)
createConfigService:43, ConfigFactory (com.alibaba.nacos.api.config)
createConfigService:44, NacosFactory (com.alibaba.nacos.api)
createConfigService:55, NacosConfigManager (com.alibaba.cloud.nacos)
<init>:43, NacosConfigManager (com.alibaba.cloud.nacos)
nacosConfigManager:43, NacosConfigBootstrapConfiguration (com.alibaba.cloud.nacos)
invoke0:-2, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
instantiate:154, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:652, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:637, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:886, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:790, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:540, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1341, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1181, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
addCandidateEntry:1525, DefaultListableBeanFactory (org.springframework.beans.factory.support)
findAutowireCandidates:1489, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveMultipleBeans:1378, DefaultListableBeanFactory (org.springframework.beans.factory.support)
doResolveDependency:1265, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveFieldValue:657, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:119, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1425, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:755, SpringApplication (org.springframework.boot)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:402, SpringApplication (org.springframework.boot)
run:312, SpringApplication (org.springframework.boot)
run:140, SpringApplicationBuilder (org.springframework.boot.builder)
bootstrapServiceContext:212, BootstrapApplicationListener (org.springframework.cloud.bootstrap)
onApplicationEvent:117, BootstrapApplicationListener (org.springframework.cloud.bootstrap)
onApplicationEvent:74, BootstrapApplicationListener (org.springframework.cloud.bootstrap)
doInvokeListener:172, SimpleApplicationEventMulticaster (org.springframework.context.event)
invokeListener:165, SimpleApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:139, SimpleApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:127, SimpleApplicationEventMulticaster (org.springframework.context.event)
environmentPrepared:80, EventPublishingRunListener (org.springframework.boot.context.event)
environmentPrepared:53, SpringApplicationRunListeners (org.springframework.boot)
prepareEnvironment:342, SpringApplication (org.springframework.boot)
run:307, SpringApplication (org.springframework.boot)
loadContext:120, SpringBootContextLoader (org.springframework.boot.test.context)
loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
loadContext:124, DefaultCacheAwareContextLoaderDelegate (org.springframework.test.context.cache)
getApplicationContext:123, DefaultTestContext (org.springframework.test.context.support)
setUpRequestContextIfNecessary:190, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:132, ServletTestExecutionListener (org.springframework.test.context.web)
prepareTestInstance:244, TestContextManager (org.springframework.test.context)
createTest:227, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runReflectiveCall:289, SpringJUnit4ClassRunner$1 (org.springframework.test.context.junit4)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
methodBlock:291, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:246, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
runChild:97, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:61, RunBeforeTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:70, RunAfterTestClassCallbacks (org.springframework.test.context.junit4.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:190, SpringJUnit4ClassRunner (org.springframework.test.context.junit4)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
execute:38, IdeaTestRunner$Repeater$1 (com.intellij.rt.junit)
repeat:11, TestsRepeater (com.intellij.rt.execution.junit)
startRunnerWithArgs:35, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:235, JUnitStarter (com.intellij.rt.junit)
main:54, JUnitStarter (com.intellij.rt.junit)

how to debug javac

· One min read

背景​

javac 是java的编译器,目前对编译原理非常感兴趣,而且对类型擦除和java的类型系统感兴趣.所以需要调试javac

How to do​

java9 之后新增了模块module功能.在这之前,javac是单独有个tools.java负载编译的.在java9之后,相关代码在jdk.compiler的module下面

java parser

· One min read

背景​

  • 了解java的.java文件的词法分析
  • 了解java的编译过程

parser​

类型检查

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java

java的的语法词法分析,生成parse树

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
(gdb) p (char *) buf
$3 = 0x7ffff5980170 "/home/dai/javademo/learn_java/generic/GenericMethod.java:8: error: name clash: sayHi(List<Integer>) and sayHi(List<String>) have the same erasure\n"
(gdb) bt
#0 __GI___libc_write (fd=fd@entry=2, buf=buf@entry=0x7ffff5980170, nbytes=nbytes@entry=146) at ../sysdeps/unix/sysv/linux/write.c:25
#1 0x00007ffff5851e28 in handleWrite (fd=2, buf=buf@entry=0x7ffff5980170, len=len@entry=146) at /home/dai/jdk/src/java.base/unix/native/libjava/io_util_md.c:196
#2 0x00007ffff58518ba in writeBytes (env=0x7ffff00295d0, this=0x7ffff5982290, bytes=<optimized out>, off=0, len=146, append=<optimized out>, fid=0xd08e043)
at /home/dai/jdk/src/java.base/share/native/libjava/io_util.c:189
#3 0x00007ffff584a2ab in Java_java_io_FileOutputStream_writeBytes (env=<optimized out>, this=<optimized out>, bytes=<optimized out>, off=<optimized out>, len=<optimized out>, append=<optimized out>)
at /home/dai/jdk/src/java.base/share/native/libjava/FileOutputStream.c:70
#4 0x00007fffe100f6cb in ?? ()
#5 0x00007ffff7d41000 in ?? ()
#6 0x0000555555581520 in ?? ()
#7 0x00007ffff00292f0 in ?? ()
#8 0x00007fffb4d44e58 in ?? ()
#9 0x00007fffe100f199 in ?? ()
#10 0x00007ffff5982208 in ?? ()
#11 0x00007fffb41f2960 in ?? ()
#12 0x00007ffff5982290 in ?? ()
#13 0x00007fffb41f3b38 in ?? ()
#14 0x0000000000000000 in ?? ()

相关阅读​