private void combineChildrenNodes(EBPFProfilingStackNode targetNode, EBPFProfilingStackNode beingMergedNode,
                                      Consumer<Tuple2<EBPFProfilingStackNode, EBPFProfilingStackNode>> continueChildrenMerging) {
        if (beingMergedNode.children.isEmpty()) {
            return;
        }

        for (EBPFProfilingStackNode childrenNode : targetNode.children) {
            // find node from being merged node children
            for (ListIterator<EBPFProfilingStackNode> it = beingMergedNode.children.listIterator(); it.hasNext(); ) {
                EBPFProfilingStackNode node = it.next();
                if (node != null && node.matches(childrenNode)) {
                    childrenNode.combineDetectedStacks(node);
                    continueChildrenMerging.accept(Tuple.of(childrenNode, node));

                    it.set(null);
                    break;
                }
            }
        }

        for (EBPFProfilingStackNode node : beingMergedNode.children) {
            if (node != null) {
                targetNode.children.add(node);
            }
        }
    }
merge all children nodes to appoint node
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/analyze/EBPFProfilingStackNode.java