You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by fa...@apache.org on 2026/08/04 08:41:19 UTC

(pekko-grpc) branch main updated: try to improve the memory usage in ByteStringUtil (#826)

This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-grpc.git


The following commit(s) were added to refs/heads/main by this push:
     new b9523b3b try to improve the memory usage in ByteStringUtil (#826)
b9523b3b is described below

commit b9523b3b171c8c677d226dc0bc2bb6fdef7c0a94
Author: PJ Fanning <pj...@users.noreply.github.com>
AuthorDate: Tue Aug 4 09:41:13 2026 +0100

    try to improve the memory usage in ByteStringUtil (#826)
---
 .../org/apache/pekko/grpc/internal/ByteStringUtils.scala  | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/runtime/src/main/scala/org/apache/pekko/grpc/internal/ByteStringUtils.scala b/runtime/src/main/scala/org/apache/pekko/grpc/internal/ByteStringUtils.scala
index 40e835b0..f970c862 100644
--- a/runtime/src/main/scala/org/apache/pekko/grpc/internal/ByteStringUtils.scala
+++ b/runtime/src/main/scala/org/apache/pekko/grpc/internal/ByteStringUtils.scala
@@ -35,12 +35,13 @@ private[grpc] object ByteStringUtils {
     val nextByte = if (initialBytes < 0) -1 else stream.read() // Test for EOF
 
     if (nextByte == -1) {
-      if (initialBytes < 1) pekko.util.ByteString.empty // EOF immediately
-      else {
-        // WARNING: buffer is retained in full below,
-        // which could be problematic if ProtobufSerializer.deserialize keeps a reference to the ByteString
-        pekko.util.ByteString.fromArrayUnsafe(buffer, 0, initialBytes)
-      }
+      if (initialBytes < 1) ByteString.empty // EOF immediately
+      else if (initialBytes > (buffer.length >> 1))
+        // Most of the buffer is used — reuse it to avoid a copy
+        ByteString.fromArrayUnsafe(buffer, 0, initialBytes)
+      else
+        // Small read from a large buffer — copy to right-size so the rest can be GC'd
+        ByteString.fromArray(buffer, 0, initialBytes)
     } else {
       val baos = new ByteArrayOutputStream(buffer.length * 2) // To avoid immediate resize
       baos.write(buffer, 0, initialBytes)
@@ -52,7 +53,7 @@ private[grpc] object ByteStringUtils {
         bytesRead = stream.read(buffer)
       }
 
-      pekko.util.ByteString.fromArrayUnsafe(baos.toByteArray)
+      ByteString.fromArrayUnsafe(baos.toByteArray)
     }
   }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org