private long memoryAuditReport() {
        long companionOverHeads = 0;
        companionOverHeads += sourceVertexIds.length * 4;
        companionOverHeads += distrLocks.length * 4;


        long bufferMem = 0;
        long maxMem = 0;
        for(IntegerBuffer buf : buffers) {
            long est = buf.memorySizeEst();
            bufferMem += est;
            maxMem = Math.max(maxMem, est);
        }

        long distributionMem = 0;
        long maxDistMem = 0;
        long avoidMem = 0;
        for(DiscreteDistribution dist : distributions) {
            long est = dist.memorySizeEst();
            distributionMem += est;
            maxDistMem = Math.max(est, maxDistMem);
            avoidMem += dist.avoidCount() * 6;
        }

        NumberFormat nf = NumberFormat.getInstance(Locale.US);

        logger.info("======= MEMORY REPORT ======");
        logger.info("Companion internal: " + nf.format(companionOverHeads / 1024. / 1024.) + " mb");

        logger.info("Buffer mem: " + nf.format(bufferMem / 1024. / 1024.) + " mb");
        logger.info("Avg bytes per buffer: " + nf.format(bufferMem * 1.0 / buffers.length / 1024.) + " kb");
        logger.info("Max buffer was: " + nf.format(maxMem / 1024.) + "kb");

        logger.info("Distribution mem: " + nf.format(distributionMem / 1024. / 1024.) + " mb");
        logger.info("- of which avoids: " + nf.format(avoidMem / 1024. / 1024.) + " mb");

        logger.info("Avg bytes per distribution: " + nf.format((distributionMem * 1.0 / distributions.length / 1024.)) + " kb");
        logger.info("Max distribution: " + nf.format(maxDistMem / 1024.) + " kb");

        long totalMem = companionOverHeads + bufferMem + distributionMem;
        logger.info("** Total:  " + nf.format(totalMem / 1024. / 1024. / 1024.) + " GB (low-mem limit " + Runtime.getRuntime().maxMemory() * 0.25 / 1024. / 1024. / 1024. + "GB)" );
        isLowInMemory = totalMem > maxMemoryBytes;

        if (isLowInMemory) {
            compactMemoryUsage();
        }

        return totalMem;
    }