<!-- If you need to report a security issue please visit https://github.com/apache/dubbo/security/policy -->

- [x] I have searched the [issues](https://github.com/apache/dubbo/issues) of this repository and believe that this is not a duplicate.

### Environment

* Dubbo version: 3.0.12 3.1.8
* Java version: 1.8

### Steps to reproduce this issue

1. consumer及provider 通过环境变量，设置参数 future.sync.set=false
2. provider返回的报文较大
3. 3.0.12版本的调用，dubbo协议不会产生频繁GC问题，triple会产生
4. 3.1.8版本调用，dubbo协议及triple协议都会产生频繁GC问题

Pls. provide [GitHub address] to reproduce this issue.

### Expected Behavior
Consumer通过dubbo或triple请求，设置了future.sync.set=false  不会在IntenalThreadLocal中保存返回结果，不再产生频繁GC问题

<!-- What do you expect from the above steps？-->

### Actual Behavior
统一设置了参数 future.sync.set=false
**3.0.12版本:**

> Dubbo协议调用 

及时清除了FutureContext，生效原因
<img width="1135" alt="image" src="https://github.com/apache/dubbo/assets/33999699/cca05d9d-dacd-4cf9-95d9-a72f9e20533d">
并在之后响应过程中清除了FutureContext
<img width="1088" alt="image" src="https://github.com/apache/dubbo/assets/33999699/c63dff14-6814-41ac-8ad2-d35968f4cd8a">
且因参数future.sync.set=false 之后也不再设置FutureContext，从而能够解决频发GC的情况

> Tiple协议调用
 
Tiple未及时清除了FutureContext原因
<img width="1027" alt="image" src="https://github.com/apache/dubbo/assets/33999699/2a71560a-2053-4d9e-8f88-07e976e7c713">
且没有在接收到响应后清除InternalThreadLocal
虽参数future.sync.set=false，但已经将FutureContext设置进了InternalThreadLocal，会造成频繁GC的情况
**3.1.8版本:**
Dubbo协议、Triple协议都没有及时清除FutureContext

> Dubbo协议调用 

<img width="1147" alt="image" src="https://github.com/apache/dubbo/assets/33999699/6b170820-1088-423f-8634-563944f6b00b">

> Tiple协议调用 

Triple未清除原因 同3.0.12
<!-- What actually happens? -->


result = new AsyncRpcResult(
            CompletableFuture.completedFuture(new AppResponse(requestObserver)), invocation);
        return result;
    }
    StreamObserver<Object> streamCall(ClientCall call,
                                      RequestMetadata metadata,
                                      StreamObserver<Object> responseObserver) {
        ObserverToClientCallListenerAdapter listener = new ObserverToClientCallListenerAdapter(
            responseObserver);
        StreamObserver<Object> streamObserver = call.start(metadata, listener);
        if (responseObserver instanceof CancelableStreamObserver) {
            final CancellationContext context = new CancellationContext();
            CancelableStreamObserver<Object> cancelableStreamObserver = (CancelableStreamObserver<Object>) responseObserver;
            cancelableStreamObserver.setCancellationContext(context);
            context.addListener(context1 -> call.cancelByLocal(new IllegalStateException("Canceled by app")));
            listener.setOnStartConsumer(dummy -> cancelableStreamObserver.startRequest());
            cancelableStreamObserver.beforeStart((ClientCallToObserverAdapter<Object>) streamObserver);
        }
        return streamObserver;
    }
    AsyncRpcResult invokeUnary(MethodDescriptor methodDescriptor, Invocation invocation,
                               ClientCall call, Executor callbackExecutor) {
        int timeout = RpcUtils.calculateTimeout(getUrl(), invocation, RpcUtils.getMethodName(invocation), 3000);
        if (timeout <= 0) {
            return AsyncRpcResult.newDefaultAsyncResult(new RpcException(RpcException.TIMEOUT_TERMINATE,
                "No time left for making the following call: " + invocation.getServiceName() + "."
                    + RpcUtils.getMethodName(invocation)+ ", terminate directly."), invocation);
        }
        invocation.setAttachment(TIMEOUT_KEY, String.valueOf(timeout));
        final AsyncRpcResult result;