[ 
https://issues.apache.org/jira/browse/IGNITE-28311?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Denis Chudov updated IGNITE-28311:
----------------------------------
    Description: 
See [1]

It creates Map<Integer, IndexLocker> using index id as a key. There is limited 
amount of index ids in the system, but every time plain int value is boxed 
causing huge heap allocations (up to 491 MiB per sample in JFR that I examined).

Stack trace:

{noformat}
void java.lang.Thread.run()
void java.lang.Thread.runWith(Object, Runnable)
void java.util.concurrent.ThreadPoolExecutor$Worker.run()
void 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
void 
org.apache.ignite.internal.replicator.ReplicaService$$Lambda.0x0000000800f9c228.run()
void 
org.apache.ignite.internal.replicator.ReplicaService.lambda$sendToReplicaRaw$6(CompletableFuture,
 ErrorReplicaResponse)
boolean java.util.concurrent.CompletableFuture.completeExceptionally(Throwable)
void java.util.concurrent.CompletableFuture.postComplete()
CompletableFuture java.util.concurrent.CompletableFuture$UniHandle.tryFire(int)
boolean java.util.concurrent.CompletableFuture.uniHandle(Object, BiFunction, 
CompletableFuture$UniHandle)
Object 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl$$Lambda.0x0000000801167068.apply(Object,
 Object)
CompletableFuture 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.lambda$trackingInvoke$13(int,
 InternalTransaction, int, ReplicaRequest, PendingTxPartitionEnlistment, 
BiPredicate, Object, Throwable)
CompletableFuture 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.trackingInvoke(InternalTransaction,
 int, Function, boolean, PendingTxPartitionEnlistment, BiPredicate, int)
CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.invoke(String, 
ReplicaRequest)
CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.sendToReplica(String, 
ReplicaRequest)
CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.sendToReplicaRaw(String, 
ReplicaRequest)
CompletableFuture 
org.apache.ignite.internal.network.MessagingService.invoke(String, 
NetworkMessage, long)
CompletableFuture 
org.apache.ignite.internal.network.wrapper.JumpToExecutorByConsistentIdAfterSend.invoke(String,
 ChannelType, NetworkMessage, long)
CompletableFuture 
org.apache.ignite.internal.network.DefaultMessagingService.invoke(String, 
ChannelType, NetworkMessage, long)
CompletableFuture 
org.apache.ignite.internal.network.DefaultMessagingService.invoke0(InternalClusterNode,
 ChannelType, NetworkMessage, long, boolean)
void 
org.apache.ignite.internal.network.DefaultMessagingService.sendToSelf(NetworkMessage,
 Long)
void 
org.apache.ignite.internal.replicator.ReplicaManager$$Lambda.0x0000000800486c98.onReceived(NetworkMessage,
 InternalClusterNode, Long)
void 
org.apache.ignite.internal.replicator.ReplicaManager.onReplicaMessageReceived(NetworkMessage,
 InternalClusterNode, Long)
void 
org.apache.ignite.internal.replicator.ReplicaManager.handleReplicaRequest(ReplicaRequest,
 InternalClusterNode, Long)
CompletableFuture 
org.apache.ignite.internal.replicator.ZonePartitionReplicaImpl.processRequest(ReplicaRequest,
 UUID)
CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.invoke(ReplicaRequest,
 UUID)
CompletableFuture java.util.concurrent.CompletableFuture.thenCompose(Function)
CompletableFuture 
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)
Object 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801058000.apply(Object)
CompletionStage 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$invoke$0(ReplicaRequest,
 UUID, ReplicaPrimacy)
CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processRequest(ReplicaRequest,
 ReplicaPrimacy, UUID)
CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processTableAwareRequest(ReplicaRequest,
 ReplicaPrimacy, UUID)
CompletableFuture java.util.concurrent.CompletableFuture.thenCompose(Function)
CompletableFuture 
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)
Object 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801072810.apply(Object)
CompletionStage 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$processTableAwareRequest$4(ReplicaRequest,
 ReplicaPrimacy, UUID, Void)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.process(ReplicaRequest,
 ReplicaPrimacy, UUID)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequestInContext(ReplicaRequest,
 ReplicaPrimacy, UUID)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequest(ReplicaRequest,
 ReplicaPrimacy)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequestWithTxOperationManagementLogic(ReplicaRequest,
 ReplicaPrimacy, HybridTimestamp)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequest(ReplicaRequest,
 ReplicaPrimacy, HybridTimestamp)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.appendTxCommand(UUID,
 ZonePartitionId, RequestType, boolean, Supplier)
Object 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener$$Lambda.0x000000080114b800.get()
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.lambda$processOperationRequest$10(ReadWriteSingleRowPkReplicaRequest,
 ReplicaPrimacy)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processSingleEntryAction(ReadWriteSingleRowPkReplicaRequest,
 long)
CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.resolveRowByPk(BinaryTuple,
 UUID, IgniteTriFunction)
Object 
org.apache.ignite.internal.table.TableImpl$$Lambda.0x00000008010250a8.get()
Map org.apache.ignite.internal.table.TableImpl.lambda$indexesLockers$1(int)
Integer java.lang.Integer.valueOf(int)
{noformat}


Probably int map should be used, or field type should be changed from plain int 
to Integer.

[1]TableImpl#indexesLockers

  was:
See [1]

It creates Map<Integer, IndexLocker> using index id as a key. There is limited 
amount of index ids in the system, but every time plain int value is boxed 
causing huge heap allocations (up to 491 MiB per sample in JFR that I examined).

Stack trace:
 
{code:java}
Stack Trace Count   Percentage void java.lang.Thread.run() 1   100 % void 
java.lang.Thread.runWith(Object, Runnable) 1   100 % void 
java.util.concurrent.ThreadPoolExecutor$Worker.run()   1   100 % void 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)   
1   100 % void 
org.apache.ignite.internal.replicator.ReplicaService$$Lambda.0x0000000800f9c228.run()
  1   100 % void 
org.apache.ignite.internal.replicator.ReplicaService.lambda$sendToReplicaRaw$6(CompletableFuture,
 ErrorReplicaResponse)    1   100 % boolean 
java.util.concurrent.CompletableFuture.completeExceptionally(Throwable) 1   100 
% void java.util.concurrent.CompletableFuture.postComplete()  1   100 % 
CompletableFuture java.util.concurrent.CompletableFuture$UniHandle.tryFire(int) 
1   100 % boolean java.util.concurrent.CompletableFuture.uniHandle(Object, 
BiFunction, CompletableFuture$UniHandle)   1   100 % Object 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl$$Lambda.0x0000000801167068.apply(Object,
 Object)  1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.lambda$trackingInvoke$13(int,
 InternalTransaction, int, ReplicaRequest, PendingTxPartitionEnlistment, 
BiPredicate, Object, Throwable)  1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.trackingInvoke(InternalTransaction,
 int, Function, boolean, PendingTxPartitionEnlistment, BiPredicate, int)    1   
100 % CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.invoke(String, 
ReplicaRequest)   1   100 % CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.sendToReplica(String, 
ReplicaRequest)    1   100 % CompletableFuture 
org.apache.ignite.internal.replicator.ReplicaService.sendToReplicaRaw(String, 
ReplicaRequest) 1   100 % CompletableFuture 
org.apache.ignite.internal.network.MessagingService.invoke(String, 
NetworkMessage, long)  1   100 % CompletableFuture 
org.apache.ignite.internal.network.wrapper.JumpToExecutorByConsistentIdAfterSend.invoke(String,
 ChannelType, NetworkMessage, long)    1   100 % CompletableFuture 
org.apache.ignite.internal.network.DefaultMessagingService.invoke(String, 
ChannelType, NetworkMessage, long)  1   100 % CompletableFuture 
org.apache.ignite.internal.network.DefaultMessagingService.invoke0(InternalClusterNode,
 ChannelType, NetworkMessage, long, boolean)   1   100 % void 
org.apache.ignite.internal.network.DefaultMessagingService.sendToSelf(NetworkMessage,
 Long)    1   100 % void 
org.apache.ignite.internal.replicator.ReplicaManager$$Lambda.0x0000000800486c98.onReceived(NetworkMessage,
 InternalClusterNode, Long)  1   100 % void 
org.apache.ignite.internal.replicator.ReplicaManager.onReplicaMessageReceived(NetworkMessage,
 InternalClusterNode, Long)   1   100 % void 
org.apache.ignite.internal.replicator.ReplicaManager.handleReplicaRequest(ReplicaRequest,
 InternalClusterNode, Long)   1   100 % CompletableFuture 
org.apache.ignite.internal.replicator.ZonePartitionReplicaImpl.processRequest(ReplicaRequest,
 UUID)   1   100 % CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.invoke(ReplicaRequest,
 UUID) 1   100 % CompletableFuture 
java.util.concurrent.CompletableFuture.thenCompose(Function)  1   100 % 
CompletableFuture 
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)    1 
  100 % Object 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801058000.apply(Object)
    1   100 % CompletionStage 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$invoke$0(ReplicaRequest,
 UUID, ReplicaPrimacy)  1   100 % CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processRequest(ReplicaRequest,
 ReplicaPrimacy, UUID) 1   100 % CompletableFuture 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processTableAwareRequest(ReplicaRequest,
 ReplicaPrimacy, UUID)   1   100 % CompletableFuture 
java.util.concurrent.CompletableFuture.thenCompose(Function)  1   100 % 
CompletableFuture 
java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)    1 
  100 % Object 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801072810.apply(Object)
    1   100 % CompletionStage 
org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$processTableAwareRequest$4(ReplicaRequest,
 ReplicaPrimacy, UUID, Void)  1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.process(ReplicaRequest,
 ReplicaPrimacy, UUID)    1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequestInContext(ReplicaRequest,
 ReplicaPrimacy, UUID)    1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequest(ReplicaRequest,
 ReplicaPrimacy)   1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequestWithTxOperationManagementLogic(ReplicaRequest,
 ReplicaPrimacy, HybridTimestamp)   1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequest(ReplicaRequest,
 ReplicaPrimacy, HybridTimestamp) 1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.appendTxCommand(UUID,
 ZonePartitionId, RequestType, boolean, Supplier)   1   100 % Object 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener$$Lambda.0x000000080114b800.get()
    1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.lambda$processOperationRequest$10(ReadWriteSingleRowPkReplicaRequest,
 ReplicaPrimacy)    1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processSingleEntryAction(ReadWriteSingleRowPkReplicaRequest,
 long)   1   100 % CompletableFuture 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.resolveRowByPk(BinaryTuple,
 UUID, IgniteTriFunction) 1   100 % Object 
org.apache.ignite.internal.table.TableImpl$$Lambda.0x00000008010250a8.get()  1  
 100 % Map 
org.apache.ignite.internal.table.TableImpl.lambda$indexesLockers$1(int) 1   100 
% Integer java.lang.Integer.valueOf(int)  1   100 %{code}
 
Probably int map should be used, or field type should be changed from plain int 
to Integer.

[1]TableImpl#indexesLockers


> Massive Integer boxing in index lockers
> ---------------------------------------
>
>                 Key: IGNITE-28311
>                 URL: https://issues.apache.org/jira/browse/IGNITE-28311
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql ai3
>            Reporter: Denis Chudov
>            Priority: Major
>              Labels: ignite-3
>
> See [1]
> It creates Map<Integer, IndexLocker> using index id as a key. There is 
> limited amount of index ids in the system, but every time plain int value is 
> boxed causing huge heap allocations (up to 491 MiB per sample in JFR that I 
> examined).
> Stack trace:
> {noformat}
> void java.lang.Thread.run()
> void java.lang.Thread.runWith(Object, Runnable)
> void java.util.concurrent.ThreadPoolExecutor$Worker.run()
> void 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
> void 
> org.apache.ignite.internal.replicator.ReplicaService$$Lambda.0x0000000800f9c228.run()
> void 
> org.apache.ignite.internal.replicator.ReplicaService.lambda$sendToReplicaRaw$6(CompletableFuture,
>  ErrorReplicaResponse)
> boolean 
> java.util.concurrent.CompletableFuture.completeExceptionally(Throwable)
> void java.util.concurrent.CompletableFuture.postComplete()
> CompletableFuture 
> java.util.concurrent.CompletableFuture$UniHandle.tryFire(int)
> boolean java.util.concurrent.CompletableFuture.uniHandle(Object, BiFunction, 
> CompletableFuture$UniHandle)
> Object 
> org.apache.ignite.internal.table.distributed.storage.InternalTableImpl$$Lambda.0x0000000801167068.apply(Object,
>  Object)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.lambda$trackingInvoke$13(int,
>  InternalTransaction, int, ReplicaRequest, PendingTxPartitionEnlistment, 
> BiPredicate, Object, Throwable)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.trackingInvoke(InternalTransaction,
>  int, Function, boolean, PendingTxPartitionEnlistment, BiPredicate, int)
> CompletableFuture 
> org.apache.ignite.internal.replicator.ReplicaService.invoke(String, 
> ReplicaRequest)
> CompletableFuture 
> org.apache.ignite.internal.replicator.ReplicaService.sendToReplica(String, 
> ReplicaRequest)
> CompletableFuture 
> org.apache.ignite.internal.replicator.ReplicaService.sendToReplicaRaw(String, 
> ReplicaRequest)
> CompletableFuture 
> org.apache.ignite.internal.network.MessagingService.invoke(String, 
> NetworkMessage, long)
> CompletableFuture 
> org.apache.ignite.internal.network.wrapper.JumpToExecutorByConsistentIdAfterSend.invoke(String,
>  ChannelType, NetworkMessage, long)
> CompletableFuture 
> org.apache.ignite.internal.network.DefaultMessagingService.invoke(String, 
> ChannelType, NetworkMessage, long)
> CompletableFuture 
> org.apache.ignite.internal.network.DefaultMessagingService.invoke0(InternalClusterNode,
>  ChannelType, NetworkMessage, long, boolean)
> void 
> org.apache.ignite.internal.network.DefaultMessagingService.sendToSelf(NetworkMessage,
>  Long)
> void 
> org.apache.ignite.internal.replicator.ReplicaManager$$Lambda.0x0000000800486c98.onReceived(NetworkMessage,
>  InternalClusterNode, Long)
> void 
> org.apache.ignite.internal.replicator.ReplicaManager.onReplicaMessageReceived(NetworkMessage,
>  InternalClusterNode, Long)
> void 
> org.apache.ignite.internal.replicator.ReplicaManager.handleReplicaRequest(ReplicaRequest,
>  InternalClusterNode, Long)
> CompletableFuture 
> org.apache.ignite.internal.replicator.ZonePartitionReplicaImpl.processRequest(ReplicaRequest,
>  UUID)
> CompletableFuture 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.invoke(ReplicaRequest,
>  UUID)
> CompletableFuture java.util.concurrent.CompletableFuture.thenCompose(Function)
> CompletableFuture 
> java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)
> Object 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801058000.apply(Object)
> CompletionStage 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$invoke$0(ReplicaRequest,
>  UUID, ReplicaPrimacy)
> CompletableFuture 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processRequest(ReplicaRequest,
>  ReplicaPrimacy, UUID)
> CompletableFuture 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.processTableAwareRequest(ReplicaRequest,
>  ReplicaPrimacy, UUID)
> CompletableFuture java.util.concurrent.CompletableFuture.thenCompose(Function)
> CompletableFuture 
> java.util.concurrent.CompletableFuture.uniComposeStage(Executor, Function)
> Object 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener$$Lambda.0x0000000801072810.apply(Object)
> CompletionStage 
> org.apache.ignite.internal.partition.replicator.ZonePartitionReplicaListener.lambda$processTableAwareRequest$4(ReplicaRequest,
>  ReplicaPrimacy, UUID, Void)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.process(ReplicaRequest,
>  ReplicaPrimacy, UUID)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequestInContext(ReplicaRequest,
>  ReplicaPrimacy, UUID)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processRequest(ReplicaRequest,
>  ReplicaPrimacy)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequestWithTxOperationManagementLogic(ReplicaRequest,
>  ReplicaPrimacy, HybridTimestamp)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processOperationRequest(ReplicaRequest,
>  ReplicaPrimacy, HybridTimestamp)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.appendTxCommand(UUID,
>  ZonePartitionId, RequestType, boolean, Supplier)
> Object 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener$$Lambda.0x000000080114b800.get()
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.lambda$processOperationRequest$10(ReadWriteSingleRowPkReplicaRequest,
>  ReplicaPrimacy)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.processSingleEntryAction(ReadWriteSingleRowPkReplicaRequest,
>  long)
> CompletableFuture 
> org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.resolveRowByPk(BinaryTuple,
>  UUID, IgniteTriFunction)
> Object 
> org.apache.ignite.internal.table.TableImpl$$Lambda.0x00000008010250a8.get()
> Map org.apache.ignite.internal.table.TableImpl.lambda$indexesLockers$1(int)
> Integer java.lang.Integer.valueOf(int)
> {noformat}
> Probably int map should be used, or field type should be changed from plain 
> int to Integer.
> [1]TableImpl#indexesLockers



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to