
PerfomanceAnalyzer
PerformanceAnalyzer gives you clear visibility into how your server is performing live and over time. With database-backed statistics, an in-game GUI, optional Discord alerts, and a helper-level AntiCheat/X-Ray module, it’s a handy toolkit for anyone.
310
0
PerfomanceAnalyzer 2.3.3
release12 апреля 2026 г.[2.3.3] - 2026-04-12
Fixed
- Sneaking/Swimming/Climbing False Positives: These movement types are now skipped entirely by the speed checker.
- Silk Touch Ores Not Recognized as Self-Placed: The player-placed block check now applies to ALL worlds, not just restricted worlds. Previously, silk-touching an ore block, placing it in your base, and breaking it would count toward XRay detection
- Y-Level Pattern Analysis Removed: Completely removed the Y-Level analysis feature. Mining at optimal Y-levels is normal gameplay (anyone can Google "best Y level for diamonds") and produced false positives
Removed
analyzeYLevelPattern(),trackYLevel(),getOptimalYRange()methods from XRayDetectorplayerOreYLevelstracking map from XRayDetectorxray_ylevel_high/medium/lowconfig entries and validationXRAY_YLEVELviolation type
PerfomanceAnalyzer 2.3.2
release11 апреля 2026 г.[2.3.2] - 2026-04-11
Fixed
- Race Condition in AlertManager: Cooldown check now uses atomic
compareAndSet()instead of separateget()/set(), preventing duplicate alerts under concurrent access - Race Condition in TickSampler: Tick sampling now uses
idx.getAndUpdate()for atomic index read-modify-write, preventing data corruption in the nanos array - Connection Pool Leak in DatabaseManager:
shutdown()now uses try-finally to ensureHikariDataSource.close()is always called, even ifflushBatchSafe()throws an exception - NullPointerException in GUIs: Added null-checks for
getItemMeta()in all GUI classes (PerformanceGUI, AntiCheatGUI, LagAnalysisGUI, PerformanceDropsGUI) — follows the safe pattern already used in ConfigGUI - Thread-Safety in ViolationTracker:
resetViolations(UUID, ViolationType)now usescomputeIfPresent()to prevent race condition where the PlayerViolations object could be removed betweenget()andcounts.remove() - MovementChecker Violation Reset Too Aggressive: Consecutive violation counters now only reset when speed is significantly below threshold (70%), preventing a single valid move from immediately washing out violations
- XRay Y-Level Thresholds Too Aggressive: Default thresholds raised from 75%/65%/55% to 85%/75%/65% to reduce false positives from legitimate caving
- UpdateChecker Missing Field Validation: Now checks for
version_numberfield existence in Modrinth API response before accessing it - Inconsistent Activity Weights:
PlayerActivityTracker.getTotalActivity()now uses centralizedConstants.ACTIVITY_WEIGHT_*values instead of hardcoded numbers
Added
- Configurable XRay Y-Level Thresholds (
config.yml)anticheat.xray_ylevel_high(default: 0.85) — percentage for maximum suspicionanticheat.xray_ylevel_medium(default: 0.75) — percentage for moderate suspicionanticheat.xray_ylevel_low(default: 0.65) — percentage for low suspicion- Config validation ensures values are 0.0-1.0 and properly ordered (low < medium < high)
- Auto-migration adds defaults for existing configs
Changed
XRayDetector.analyzeYLevelPattern()reads thresholds from config instead of using hardcoded values
PerfomanceAnalyzer 2.3.1
release10 апреля 2026 г.[2.3.1] - 2026-04-10
Added
- Silent Mode / Streamer Mode (
/perfsilent)- Toggle all alerts on/off:
/perfsilent - Toggle per category:
/perfsilent xray,/perfsilent movement,/perfsilent performance - Reset all preferences at once:
/perfsilent reset - View current status:
/perfsilent list - Persistent across server restarts (saved in
config.ymlunderalerts.silent_players) - Aliases:
/ps,/silent - Full tab-completion support
- Bilingual: German & English language strings
- Toggle all alerts on/off:
- AntiCheat DB Cleanup Commands
/movealerts clear <player> --db— deletes movement violation entries from the database/xrayalerts clear <player> --db— deletes XRay detection entries from the database- Without
--db: only clears in-memory alerts (as before), now shows a hint about the--dboption - Tab-completion for
--dbflag
- Teleport Immunity for Movement Checks
- New
PlayerTeleportEventlistener prevents false positives from legitimate teleports (/tp,/home, ender pearls, etc.) - 1-second grace period after any teleport where movement checks are skipped
lastLocationsreset to teleport destination to prevent follow-up false positives- Consecutive violation counters reset on teleport
- New
Fixed
- Version Inconsistency: pom.xml, plugin.yml, and main class now use the same version dynamically via
getDescription().getVersion()instead of hardcoded strings - Race Condition in AsyncConfigSaver:
pendingSavechanged fromvolatile booleantoAtomicBooleanwith proper atomic check-and-set operations, preventing lost config saves under concurrent requests - NullPointerException in PerformanceDropAnalyzer: Added null-checks for
Player.getWorld()andPlayer.getLocation()during world unload scenarios - Memory Leak in AlertManager: Added periodic cleanup task (every 5 minutes) for stale
lastAlertTimesentries that were never removed - AntiCheat False Positives: Improved lag compensation from linear to square-root scaling (200ms ping = +10%, 500ms = +20%, 1000ms = +30%), reducing false positives for high-ping players without allowing extreme speeds
Changed
- All three alert systems (
AlertManager,XRayAlertManager,MovementAlertManager) now respect per-player alert preferences before sending chat notifications - Config auto-migration adds
alerts.silent_playersfor new installations
PerfomanceAnalyzer 2.3.0
release22 февраля 2026 г.[2.3.0] - 2026-02-22
Added
- Lag Compensation for Movement Checks
- Player ping considered in speed calculations (+10% per 100ms above 100ms)
- Reduces false-positives for high-ping players
- Knockback/Damage Immunity Detection
- 2-second immunity window after explosions and entity attacks
- Prevents false-positives from legitimate knockback
- Y-Level Analysis for XRay Detection
- Tracks mining height for all ores
- Optimal Y-level ranges based on Minecraft 1.21
- New detection method:
XRAY_YLEVEL - Detects suspicious pattern: 75%+ mining at optimal height
- Async Chunk Analysis
- Uses
ChunkSnapshotfor thread-safe analysis - Parallel processing with
CompletableFuture - 90% less main-thread load during performance drop analysis
- Timeout protection maintained
- Uses
- Auto-Cleanup for Database
- Automatic retention policy (default: 30 days)
- Runs daily (1h after startup, then every 24h)
- Configurable:
database.retention_days(set to 0 to disable)
- GUI Auto-Refresh System
- Performance data updates every 3 seconds
- Only active for open GUIs (no overhead)
- Automatic cleanup on GUI close
- Configurable:
gui.auto_refresh
- Trend Analysis for World Stats
- Historical tracking (up to 288 snapshots = 24h @ 5min intervals)
- Trend direction:
INCREASING,DECREASING,STABLE - Change rate calculation (entities/hour)
- Methods:
recordSnapshot(),analyzeTrend(),analyzeTrendsForAllWorlds()
- REST API for External Monitoring
- 4 JSON endpoints:
/api/health,/api/metrics,/api/worlds,/api/trends - API key authentication (
Authorization: Bearer) - Perfect for Grafana/Prometheus dashboards
- Config:
api.enabled,api.port,api.key
- 4 JSON endpoints:
- Automatic Entity Cleaner
- Smart entity management to prevent lag
- Priority-based removal (items → projectiles → monsters → animals)
- Protection for named entities, tamed animals, villagers
- Boss mob blacklist (Ender Dragon, Wither, Warden)
- Per-world and per-chunk limits
- Dry-run mode for safe testing
- Config:
entity_cleaner.*
Changed
- Movement Checker (
MovementChecker.java)- Added environmental checks (slime blocks, bubble columns)
- 2x vertical speed allowance near slime blocks/bubble columns
- Enhanced cleanup method to include new tracking maps
- XRay Detector (
XRayDetector.java)- Added Y-level tracking for pattern analysis
- New method:
analyzeYLevelPattern() - New method:
getOptimalYRange()with Minecraft 1.21 spawn data - Enhanced
checkSuspiciousPattern()with Y-level analysis
- Performance Drop Analyzer (
PerformanceDropAnalyzer.java)- Replaced synchronous chunk analysis with async processing
- Added
analyzeChunkAsync()method using ChunkSnapshot - Legacy
analyzeChunk()kept as fallback - Improved error handling for async operations
- Database Manager (
DatabaseManager.java)- Added auto-cleanup task for retention management
- Enhanced shutdown procedure to cancel cleanup task
- World Stats Manager (
WorldStatsManager.java)- Added trend tracking infrastructure
- New records:
WorldStatsSnapshot,TrendAnalysis - Multiple helper methods for trend calculation
- Performance GUI (
PerformanceGUI.java)- Added auto-refresh system with task management
- New
InventoryCloseEventhandler for cleanup - New method:
shutdown()for proper cleanup
- Plugin Config (
PluginConfig.java)- Added 10 new config methods for features
- Auto-migration for all new config entries
Fixed
- Memory leaks from incomplete cleanup (movement checker, XRay detector)
- False-positives in movement detection from knockback
- False-positives in movement detection from environmental effects
- Main-thread bottleneck in chunk analysis
Performance
- 90% reduction in main-thread load during performance drop analysis
- Reduced false-positive alerts (less CPU overhead)
- More efficient memory usage with automatic cleanup
Security
- REST API authentication with API keys
- SSRF protection in Discord webhook validation (from v2.2.0)
- SQL injection prevention (from v2.2.0)
PerfomanceAnalyzer 2.2.0
release6 января 2026 г.[2.2.0] - 2026-01-05
🏗️ Major Release - Stability & Performance Update
This release focuses on security hardening, graceful degradation, performance optimizations, and critical bug fixes to ensure stable operation on production servers.
🔐 Security Hardening
SQL Injection Prevention
- Type-Safe Database Queries
- New
TimeUnitenum for SQL time unit operations - Replaces dangerous string concatenation in
DatabaseManager - Prevents SQL injection attacks via time-based queries
- Enum values:
SECOND,MINUTE,HOUR,DAY - Each value provides safe SQL name via
getSqlNameUpper()
- New
SSRF Protection
- Discord Webhook URL Validation
- Protocol validation: HTTPS-only (HTTP rejected)
- Domain whitelist: Only
discord.comanddiscordapp.comallowed - Path validation: Must start with
/api/webhooks/ - Prevents Server-Side Request Forgery attacks
- Logs validation failures for security monitoring
Memory Leak Prevention
- Size Limits on All Maps
XRayDetector.playerPlacedBlocks- Max size: 10,000 entriesXRayDetector.playerOreMines- NEW: Max size: 5,000 playersXRayDetector.playerStoneMines- NEW: Max size: 5,000 playersMovementChecker.moveCounter- Periodic reset at threshold- Automatic cleanup routines prevent unbounded growth
- Warning logs when size limits are hit
- Debug logging shows cleanup statistics and map sizes
💾 Graceful Degradation
FallbackLogger System
- Automatic Database Failover
- Queue-based async file writing (
ConcurrentLinkedQueue) - CSV format:
timestamp | type | value | description - Detects 3 consecutive database failures
- Switches to file logging automatically
- Configurable flush threshold (default: 100 entries)
- File rotation and management
- Fallback file path:
plugins/PerformanceAnalyzer/fallback.log
- Queue-based async file writing (
Database Availability Monitoring
- Failure Detection
isDatabaseAvailable()method for health checks- Consecutive failure counter
- Automatic recovery detection (resets to DB logging)
- Logs critical warnings when switching modes
Configuration
fallback_logging:
enabled: true
file: "plugins/PerformanceAnalyzer/fallback.log"
⚡ Performance & Reliability
AsyncConfigSaver (CRITICAL FIX)
- Thread-Safe Config Operations
- FIXED: Now uses Bukkit Scheduler instead of ForkJoinPool
- CRITICAL:
saveConfig()runs on main thread (Bukkit requirement) - Previously used
CompletableFuture.runAsync()which caused ConcurrentModificationException - Uses
CompletableFuturefor async pattern - Atomic boolean flags prevent concurrent saves
saveAsync()schedules on main thread viarunTask()saveSyncOnShutdown()ensures data persistence on server stop- Error handling with exception logging and stack traces
- Prevents thread-safety violations and data corruption
Performance Optimizations
-
Event Sampling - Movement checks reduced by ~90%
- Only every 10th PlayerMoveEvent processed
- OR significant distance (>2 blocks) always checked
- Counter reset at 1000 to prevent overflow
- Minimal detection accuracy loss
-
Database Indexing
- Indexes on
timestampcolumn for time-range queries - Indexes on
typecolumn for metric filtering - Significantly faster query performance
- Auto-created during database initialization
- Indexes on
Constants Class
- Centralized Configuration
- 255 lines of well-organized constants
- Categories: Database, Discord, Movement, XRay, Performance, Vehicle Speeds
- No more magic numbers scattered throughout codebase
- Easy to tune and maintain
- All values documented with comments
🏗️ Architecture Improvements
CommandRegistry System
- Modular Command Registration
- Replaces 112-line monster method in
PerformanceAnalyzer - Separate methods for each category:
registerPerformanceCommands()- /perfstatus, /perfhistory, /perfreloadregisterAnalysisCommands()- /worldstats, /entitystats, /chunkstats, /perfdropsregisterGUICommands()- /perfguiregisterAntiCheatCommands()- /acwhitelist, /xrayalerts, /movealerts, /xrayores
- Easy to extend with new commands
- Clean separation of concerns
- AntiCheat commands dynamically registered when module enabled
- Replaces 112-line monster method in
ConfigMigrator Class
- Extracted Migration Logic
- Separate class for config version upgrades
- Version-by-version migration (v0 → v1 → v2 → ... → v5)
- Only runs when
config_version < Constants.CONFIG_VERSION - Returns boolean if changes were made
- Cleaner
PluginConfigclass (separation of concerns) - Easy to add new migrations
Public API
- PerformanceAPI Interface
double getCurrentTPS()- Get current server TPSdouble getCurrentMSPT()- Get current MSPTboolean isPlayerSuspicious(UUID playerUUID)- Check if player flagged- Enables third-party plugin integration
- Future: Additional methods for detailed performance data
🐛 Critical Bug Fixes
DatabaseManager Exception Handling
- FIXED: Added missing stack traces to SQL exceptions
- IMPROVED: Now logs failed SQL statements for debugging
- ADDED: JavaDoc documentation for
run()method - Better error messages for database initialization failures
- Prevents silent failures during schema creation
XRayDetector Map Size Enforcement
- FIXED: Unbounded memory growth in
playerOreMinesandplayerStoneMines - ADDED: Hard limit of 5,000 player entries per map
- IMPROVED: Cleanup task now removes empty
playerStoneMinesentries - Warning logs when size limit is exceeded
- Debug output shows current map sizes
Config.yml Language Consistency
- FIXED: All comments now in English (was mixed German/English)
- Consistent with multi-language support design
- User-facing messages still use language files (en.yml/de.yml)
- Better for international plugin distribution
🔧 Code Quality Improvements
- Consistent Error Handling - All exceptions logged with stack traces
- English Logging - All console logs in English (user-facing messages use i18n)
- Null Safety - Extensive null checks before operations
- Improved Documentation - JavaDoc added to critical methods
- Code Comments - All config comments translated to English
📦 New Files Created
util/Constants.java- Centralized constantscommands/CommandRegistry.java- Modular command registrationconfig/ConfigMigrator.java- Config migration logicconfig/AsyncConfigSaver.java- Async config savesdb/FallbackLogger.java- Fallback file loggingdb/TimeUnit.java- SQL-safe time unitsapi/PerformanceAPI.java- Public API interface
🔧 Modified Files
PerformanceAnalyzer.java- CommandRegistry integration, version update to 2.2.0DatabaseManager.java- CRITICAL FIX: Stack traces, SQL logging, FallbackLogger, TimeUnit enum, failure detectionAsyncConfigSaver.java- CRITICAL FIX: Thread-safety with Bukkit SchedulerPluginConfig.java- AsyncConfigSaver, ConfigMigrator, fallback config methodsDiscordWebhook.java- URL validation, SSRF protectionMovementChecker.java- Constants usage, event samplingXRayDetector.java- CRITICAL FIX: Size limits (5000 players), improved cleanup, memory leak preventionConstants.java- NEW:XRAY_MAX_PLAYER_ENTRIESconstantconfig.yml- FIXED: All comments translated to Englishpom.xml- Version 2.2.0
⚠️ Breaking Changes
None - This release is fully backward compatible with v2.1.0.
- All new features have sensible defaults
- Existing configs auto-migrate
- No database schema changes
- No API changes to existing methods
📊 Configuration Changes
New Config Sections:
# Graceful Degradation
fallback_logging:
enabled: true
file: "plugins/PerformanceAnalyzer/fallback.log"
Auto-Migration:
- Config auto-migrates from v5 to v5 (no version bump needed)
- New
fallback_loggingsection added automatically - Existing settings preserved
🔄 Migration Guide (from v2.1.0)
- Backup - Backup your
plugins/PerformanceAnalyzer/folder - Stop Server - Stop your server
- Replace JAR - Replace old JAR with
PerformanceAnalyzer-2.2.0.jar - Start Server - Start your server
- Auto-Migration - Config auto-updates (check console for "Config migrated")
- Verify - Run
/perfstatusto ensure plugin loaded correctly
Optional Post-Migration:
- Review fallback logging settings in
config.yml - Check
fallback.logfile (created only on database failure)
📈 Performance Impact
- CPU Usage: Reduced ~90% for movement checks (event sampling)
- Memory Usage: Lower (cleanup routines, size limits)
- Disk I/O: Reduced (async config saves, fallback only on failure)
- Database Load: Reduced (batching, indexing)
- Startup Time: Unchanged
🐛 Known Issues
None - All known issues from v2.1.0 have been resolved, including:
- ✅ AsyncConfigSaver thread-safety violation (ConcurrentModificationException)
- ✅ DatabaseManager silent failures (missing stack traces)
- ✅ XRayDetector unbounded memory growth (5000+ players)
- ✅ Config.yml mixed language comments (now all English)
Создатели
Детали
Лицензия:MIT
Опубликован:5 месяцев назад
Обновлён:1 неделю назад
