test-memory-debug.mjs•4.34 kB
import v8 from 'v8';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
// Create directory for snapshots
const snapshotDir = path.join(__dirname, 'heap-snapshots');
if (!fs.existsSync(snapshotDir)) {
fs.mkdirSync(snapshotDir, { recursive: true });
}
// Clean old snapshots
fs.readdirSync(snapshotDir).forEach(file => {
if (file.endsWith('.heapsnapshot')) {
fs.unlinkSync(path.join(snapshotDir, file));
}
});
function formatMemory() {
const mem = process.memoryUsage();
return {
heap: `${(mem.heapUsed / 1024 / 1024).toFixed(2)}MB / ${(mem.heapTotal / 1024 / 1024).toFixed(2)}MB`,
rss: `${(mem.rss / 1024 / 1024).toFixed(2)}MB`,
external: `${(mem.external / 1024 / 1024).toFixed(2)}MB`
};
}
function takeSnapshot(label) {
if (global.gc) global.gc();
const filename = path.join(snapshotDir, `${label}.heapsnapshot`);
v8.writeHeapSnapshot(filename);
console.log(`[SNAPSHOT] ${label}: ${JSON.stringify(formatMemory())}`);
}
console.log('=== Memory Debug Test ===\n');
// Take initial snapshot
takeSnapshot('01-initial');
// Import just the modules to see memory impact
console.log('\n1. Importing test dependencies...');
const before1 = process.memoryUsage().heapUsed;
import { describe, it, expect, beforeEach, vi } from 'vitest';
const after1 = process.memoryUsage().heapUsed;
console.log(` Vitest import: +${((after1 - before1) / 1024 / 1024).toFixed(2)}MB`);
console.log('\n2. Importing fs modules...');
const before2 = process.memoryUsage().heapUsed;
import * as fsPromises from 'fs/promises';
import { existsSync } from 'fs';
const after2 = process.memoryUsage().heapUsed;
console.log(` FS import: +${((after2 - before2) / 1024 / 1024).toFixed(2)}MB`);
console.log('\n3. Importing language server modules...');
const before3 = process.memoryUsage().heapUsed;
import { LanguageServerManager } from './dist/languageServerManager.js';
import { LanguageServerService } from './dist/languageServerService.js';
const after3 = process.memoryUsage().heapUsed;
console.log(` Language server import: +${((after3 - before3) / 1024 / 1024).toFixed(2)}MB`);
takeSnapshot('02-after-imports');
// Now let's see what happens when we create instances
console.log('\n4. Creating LanguageServerManager instance...');
const before4 = process.memoryUsage().heapUsed;
const manager = new LanguageServerManager({
monorepoRoot: '/test/monorepo',
projects: []
});
const after4 = process.memoryUsage().heapUsed;
console.log(` Manager creation: +${((after4 - before4) / 1024 / 1024).toFixed(2)}MB`);
takeSnapshot('03-after-manager-creation');
console.log('\n5. Creating LanguageServerService instance...');
const before5 = process.memoryUsage().heapUsed;
const service = new LanguageServerService();
const after5 = process.memoryUsage().heapUsed;
console.log(` Service creation: +${((after5 - before5) / 1024 / 1024).toFixed(2)}MB`);
takeSnapshot('04-after-service-creation');
// Try to trigger TypeScript loading
console.log('\n6. Mocking fs and trying initialization...');
vi.mock('fs/promises');
vi.mock('fs', () => ({
existsSync: vi.fn(),
}));
vi.mocked(fsPromises.readFile).mockResolvedValue(JSON.stringify({
compilerOptions: {
target: 'es2020',
module: 'commonjs',
skipLibCheck: true,
noLib: true,
types: [],
typeRoots: [],
},
exclude: ['node_modules']
}));
vi.mocked(existsSync).mockReturnValue(true);
const before6 = process.memoryUsage().heapUsed;
try {
await service.initialize('/test/monorepo', false);
} catch (e) {
console.log(' Init failed:', e.message);
}
const after6 = process.memoryUsage().heapUsed;
console.log(` Initialization attempt: +${((after6 - before6) / 1024 / 1024).toFixed(2)}MB`);
takeSnapshot('05-after-init-attempt');
// Final memory state
console.log('\n=== Final Memory State ===');
console.log(formatMemory());
console.log('\n=== Heap Snapshots Saved ===');
console.log('Location:', snapshotDir);
console.log('\nTo analyze:');
console.log('1. Open Chrome/Edge DevTools');
console.log('2. Go to Memory tab');
console.log('3. Click "Load" and select the .heapsnapshot files');
console.log('4. Compare snapshots to see memory growth');
process.exit(0);