Skip to content

Commit d0777df

Browse files
AXIS2-6099 Add http/2 features in new JSON packages moshih2 and gsonh2, with default parameters set up for a reasonably tuned config by default
1 parent dfe926b commit d0777df

File tree

11 files changed

+3130
-252
lines changed

11 files changed

+3130
-252
lines changed

modules/json/src/org/apache/axis2/json/gsonh2/EnhancedGsonJsonBuilder.java

Lines changed: 635 additions & 0 deletions
Large diffs are not rendered by default.

modules/json/src/org/apache/axis2/json/gsonh2/EnhancedGsonJsonFormatter.java

Lines changed: 923 additions & 0 deletions
Large diffs are not rendered by default.

modules/json/src/org/apache/axis2/json/gsonh2/GsonProcessingMetrics.java

Lines changed: 493 additions & 0 deletions
Large diffs are not rendered by default.

modules/json/src/org/apache/axis2/json/moshih2/EnhancedMoshiJsonBuilder.java

Lines changed: 174 additions & 27 deletions
Large diffs are not rendered by default.

modules/json/src/org/apache/axis2/json/moshih2/EnhancedMoshiJsonFormatter.java

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
* - Intelligent output streaming based on response size and complexity
6666
* - Memory management with buffer optimization for large responses
6767
* - Performance metrics collection for response generation analysis
68-
* - Field-specific output optimizations for RAPI-style data patterns
68+
* - Field-specific output optimizations for JSON-style data patterns
6969
* - Flow control patterns during response generation (from HTTP2FlowController concepts)
7070
* - Streaming configuration based on payload characteristics
7171
*
@@ -77,7 +77,7 @@
7777
* - 30-50% performance improvement for large JSON responses (>1MB)
7878
* - Reduced memory usage through intelligent buffering and streaming
7979
* - Better throughput for concurrent JSON response generation
80-
* - Specialized optimization for RAPI-style response patterns
80+
* - Specialized optimization for JSON-style response patterns
8181
* - Prevents blocking behavior during large response generation
8282
*/
8383
public class EnhancedMoshiJsonFormatter implements MessageFormatter {
@@ -148,7 +148,7 @@ public void writeTo(MessageContext outMsgCtxt, OMOutputFormat omOutputFormat, Ou
148148
if (log.isDebugEnabled()) {
149149
log.debug("EnhancedMoshiH2Formatter: [" + responseId + "] Large response detected - suggesting GC optimization");
150150
}
151-
suggestGarbageCollectionForResponse();
151+
monitorMemoryPressureForResponse();
152152
}
153153

154154
// Generate response with appropriate strategy
@@ -245,7 +245,7 @@ private void generateLargeResponseOptimized(MessageContext outMsgCtxt, OMOutputF
245245
// Apply memory optimization patterns (from HTTP/2 integration)
246246
if (strategy.getEstimatedSize() > MEMORY_OPTIMIZATION_THRESHOLD) {
247247
log.debug("Applying memory optimization for very large response: " + responseId);
248-
suggestGarbageCollectionForResponse();
248+
monitorMemoryPressureForResponse();
249249
}
250250

251251
generateWithEnhancedMoshi(outMsgCtxt, omOutputFormat, outputStream, preserve, strategy, responseId);
@@ -429,7 +429,7 @@ private void generateCollectionResponseOptimized(java.util.Collection<?> collect
429429

430430
if (itemCount % 5000 == 0) {
431431
// Memory management for very large collections
432-
suggestGarbageCollectionForResponse();
432+
monitorMemoryPressureForResponse();
433433

434434
if (log.isDebugEnabled()) {
435435
log.debug("Processed " + itemCount + " collection items for response: " + responseId);
@@ -520,13 +520,26 @@ private String generateResponseId() {
520520
}
521521

522522
/**
523-
* Memory management for large responses (pattern from HTTP/2 integration).
523+
* Memory pressure monitoring for large responses.
524+
* Note: Removed System.gc() call - libraries should not interfere with application GC strategy.
524525
*/
525-
private void suggestGarbageCollectionForResponse() {
526+
private void monitorMemoryPressureForResponse() {
526527
if (log.isDebugEnabled()) {
527-
log.debug("Suggesting garbage collection for Enhanced Moshi H2 large response generation");
528+
Runtime runtime = Runtime.getRuntime();
529+
long totalMemory = runtime.totalMemory();
530+
long freeMemory = runtime.freeMemory();
531+
long usedMemory = totalMemory - freeMemory;
532+
double memoryUsage = (double) usedMemory / totalMemory * 100;
533+
534+
log.debug("Memory pressure monitoring during large response generation: "
535+
+ String.format("%.1f%% used (%s / %s)", memoryUsage,
536+
formatBytes(usedMemory), formatBytes(totalMemory)));
537+
538+
if (memoryUsage > 85.0) {
539+
log.warn("High memory pressure detected (" + String.format("%.1f", memoryUsage) + "% used) during JSON response generation. " +
540+
"Consider increasing heap size or reducing response size.");
541+
}
528542
}
529-
System.gc();
530543
}
531544

532545
/**
@@ -682,7 +695,7 @@ public void writeStartElement(String localName) throws XMLStreamException {
682695

683696
// Apply memory optimization for large responses
684697
if (strategy.isLargeResponse() && shouldOptimizeMemory()) {
685-
optimizeMemoryForLargeResponse();
698+
monitorMemoryForLargeResponse();
686699
}
687700

688701
// Call parent implementation
@@ -714,7 +727,7 @@ public void writeCharacters(String text) throws XMLStreamException {
714727

715728
// Memory pressure monitoring for very large text content
716729
if (text.length() > 10000 && shouldOptimizeMemory()) {
717-
optimizeMemoryForLargeResponse();
730+
monitorMemoryForLargeResponse();
718731
}
719732
}
720733

@@ -794,20 +807,33 @@ private boolean shouldOptimizeMemory() {
794807
}
795808

796809
/**
797-
* Apply memory optimization for large responses.
810+
* Monitor memory pressure during large response processing.
811+
* Note: Removed System.gc() call - libraries should not interfere with application GC strategy.
798812
*/
799-
private void optimizeMemoryForLargeResponse() {
813+
private void monitorMemoryForLargeResponse() {
800814
long currentTime = System.nanoTime();
801815

802-
// Avoid too frequent GC hints (max once per 5 seconds)
816+
// Avoid too frequent memory checks (max once per 5 seconds)
803817
if (currentTime - lastGcHint > 5_000_000_000L) {
818+
Runtime runtime = Runtime.getRuntime();
819+
long totalMemory = runtime.totalMemory();
820+
long freeMemory = runtime.freeMemory();
821+
long usedMemory = totalMemory - freeMemory;
822+
double memoryUsage = (double) usedMemory / totalMemory * 100;
823+
804824
if (enhancedLog.isDebugEnabled()) {
805-
enhancedLog.debug("EnhancedMoshiXMLStreamWriter: [" + responseId + "] Suggesting GC for memory optimization");
825+
enhancedLog.debug("EnhancedMoshiXMLStreamWriter: [" + responseId + "] Memory monitoring: "
826+
+ String.format("%.1f%% used (%s / %s)", memoryUsage,
827+
formatBytesLocal(usedMemory), formatBytesLocal(totalMemory)));
828+
}
829+
830+
if (memoryUsage > 85.0) {
831+
enhancedLog.warn("High memory pressure detected (" + String.format("%.1f", memoryUsage) + "% used) in XML stream writer. " +
832+
"Consider increasing heap size.");
806833
}
807834

808-
System.gc(); // Hint for garbage collection
809835
lastGcHint = currentTime;
810-
memoryOptimized = true;
836+
memoryOptimized = true; // Keep this flag to indicate memory monitoring occurred
811837
}
812838
}
813839

0 commit comments

Comments
 (0)