char Утечка памяти в Java

Я получаю большую утечку памяти от char. Это не мое письмо, и я не умею очищать память, поэтому помощь будет оценена по достоинству. Этот класс использует char, поэтому я начну с него.

package server.util;

import java.text.NumberFormat;

import org.jboss.netty.buffer.ChannelBuffer;

public class Misc {

    public static String getRS2String(final ChannelBuffer buf) {
        final StringBuilder bldr = new StringBuilder();
        byte b;
        while (buf.readable() && (b = buf.readByte()) != 10)
            bldr.append((char) b);
        return bldr.toString();
    }

    public static double randomDouble(double min, double max) {
        return (Math.random() * (max - min) + min);
    }

    public static String formatPlayerName(String str) {
        str = ucFirst(str);
        str.replace("_", " ");
        return str;
    }

    public static int getCurrentHP(int i, int i1, int i2) {
        double x = (double) i / (double) i1;
        return (int) Math.round(x * i2);
    }

    public static String removeSpaces(String s) {
        return s.replace(" ", "");
    }

    public static String capitalize(String s) {
        for (int i = 0; i < s.length(); i++) {
            if (i == 0) {
                s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
                        s.substring(1));
            }
            if (!Character.isLetterOrDigit(s.charAt(i))) {
                if (i + 1 < s.length()) {
                    s = String.format("%s%s%s", s.subSequence(0, i + 1),
                            Character.toUpperCase(s.charAt(i + 1)),
                            s.substring(i + 2));
                }
            }
        }
        return s;
    }

    public static boolean goodDistance(int objectX, int objectY, int playerX,
            int playerY, int distance) {
        return ((objectX - playerX <= distance && objectX - playerX >= -distance) && (objectY
                - playerY <= distance && objectY - playerY >= -distance));
    }

    public static int distanceToPoint(int pointX, int pointY, int pointX2, int pointY2) {
        return (int) Math.sqrt(Math.pow(pointX2 - pointX, 2)
                + Math.pow(pointY2 - pointY, 2));
    }

    public static String longToReportPlayerName(long l) {
        int i = 0;
        final char ac[] = new char[12];
        while (l != 0L) {
            final long l1 = l;
            l /= 37L;
            ac[11 - i++] = Misc.playerNameXlateTable[(int) (l1 - l * 37L)];
        }
        return new String(ac, 12 - i, i);
    }

    public static String longToPlayerName(long l) {
        int i = 0;
        char ac[] = new char[12];

        while (l != 0L) {
            long l1 = l;

            l /= 37L;
            ac[11 - i++] = xlateTable[(int) (l1 - l * 37L)];
        }
        return new String(ac, 12 - i, i);
    }

    public static final char playerNameXlateTable[] = { '_', 'a', 'b', 'c',
            'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
            'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
            '3', '4', '5', '6', '7', '8', '9', '[', ']', '/', '-', ' ' };

    public static String longToPlayerName2(long l) {
        int i = 0;
        char ac[] = new char[99];
        while (l != 0L) {
            long l1 = l;
            l /= 37L;
            ac[11 - i++] = playerNameXlateTable[(int) (l1 - l * 37L)];
        }
        return new String(ac, 12 - i, i);
    }

    public static String format(int num) {
        return NumberFormat.getInstance().format(num);
    }

    public static String ucFirst(String str) {
        str = str.toLowerCase();
        if (str.length() > 1) {
            str = str.substring(0, 1).toUpperCase() + str.substring(1);
        } else {
            return str.toUpperCase();
        }
        return str;
    }

    public static void print_debug(String str) {
        System.out.print(str);
    }

    public static void println_debug(String str) {
        System.out.println(str);
    }

    public static void print(String str) {
        System.out.print(str);
    }

    public static void println(String str) {
        System.out.println(str);
    }

    public static String Hex(byte data[]) {
        return Hex(data, 0, data.length);
    }

    public static String Hex(byte data[], int offset, int len) {
        String temp = "";
        for (int cntr = 0; cntr < len; cntr++) {
            int num = data[offset + cntr] & 0xFF;
            String myStr;
            if (num < 16)
                myStr = "0";
            else
                myStr = "";
            temp += myStr + Integer.toHexString(num) + " ";
        }
        return temp.toUpperCase().trim();
    }

    public static int hexToInt(byte data[], int offset, int len) {
        int temp = 0;
        int i = 1000;
        for (int cntr = 0; cntr < len; cntr++) {
            int num = (data[offset + cntr] & 0xFF) * i;
            temp += num;
            if (i > 1)
                i = i / 1000;
        }
        return temp;
    }

    public static String basicEncrypt(String s) {
        String toReturn = "";
        for (int j = 0; j < s.length(); j++) {
            toReturn += (int) s.charAt(j);
        }
        // System.out.println("Encrypt: " + toReturn);
        return toReturn;
    }

    /**
     * 
     * @param range - range of random number
     * @return from 1 to specified range number
     */
    public static int random2(int range) {
        return (int) ((java.lang.Math.random() * range) + 1);
    }

    /**
     * 
     * @param range - range from 0 to specified range
     * @return from 0 to specified range
     */
    public static int random(int range) {
        return (int) (java.lang.Math.random() * (range + 1));
    }

    public static long playerNameToInt64(String s) {
        long l = 0L;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            l *= 37L;
            if (c >= 'A' && c <= 'Z')
                l += (1 + c) - 65;
            else if (c >= 'a' && c <= 'z')
                l += (1 + c) - 97;
            else if (c >= '0' && c <= '9')
                l += (27 + c) - 48;
        }
        while (l % 37L == 0L && l != 0L)
            l /= 37L;
        return l;
    }

    private static char decodeBuf[] = new char[4096];

    public static String textUnpack(byte packedData[], int size) {
        int idx = 0, highNibble = -1;
        for (int i = 0; i < size * 2; i++) {
            int val = packedData[i / 2] >> (4 - 4 * (i % 2)) & 0xf;
            if (highNibble == -1) {
                if (val < 13)
                    decodeBuf[idx++] = xlateTable[val];
                else
                    highNibble = val;
            } else {
                decodeBuf[idx++] = xlateTable[((highNibble << 4) + val) - 195];
                highNibble = -1;
            }
        }

        return new String(decodeBuf, 0, idx);
    }

    public static String optimizeText(String s) {
        for (int i = 0; i < s.length(); i++) {
            if (i == 0) {
                s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
                        s.substring(1));
            }
            if (!Character.isLetterOrDigit(s.charAt(i))) {
                if (i + 1 < s.length()) {
                    s = String.format("%s%s%s", s.subSequence(0, i + 1),
                            Character.toUpperCase(s.charAt(i + 1)),
                            s.substring(i + 2));
                }
            }
        }
        return s;
    }

    public static void textPack(byte packedData[], java.lang.String text) {
        if (text.length() > 80)
            text = text.substring(0, 80);
        text = text.toLowerCase();

        int carryOverNibble = -1;
        int ofs = 0;
        for (int idx = 0; idx < text.length(); idx++) {
            char c = text.charAt(idx);
            int tableIdx = 0;
            for (int i = 0; i < xlateTable.length; i++) {
                if (c == xlateTable[i]) {
                    tableIdx = i;
                    break;
                }
            }
            if (tableIdx > 12)
                tableIdx += 195;
            if (carryOverNibble == -1) {
                if (tableIdx < 13)
                    carryOverNibble = tableIdx;
                else
                    packedData[ofs++] = (byte) (tableIdx);
            } else if (tableIdx < 13) {
                packedData[ofs++] = (byte) ((carryOverNibble << 4) + tableIdx);
                carryOverNibble = -1;
            } else {
                packedData[ofs++] = (byte) ((carryOverNibble << 4) + (tableIdx >> 4));
                carryOverNibble = tableIdx & 0xf;
            }
        }

        if (carryOverNibble != -1)
            packedData[ofs++] = (byte) (carryOverNibble << 4);
    }

    public static char xlateTable[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n',
            's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b',
            'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-',
            '&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"',
            '[', ']' };

    public static int direction(int srcX, int srcY, int x, int y) {
        double dx = (double) x - srcX, dy = (double) y - srcY;
        double angle = Math.atan(dy / dx);
        angle = Math.toDegrees(angle);
        if (Double.isNaN(angle))
            return -1;
        if (Math.signum(dx) < 0)
            angle += 180.0;
        return (int) ((((90 - angle) / 22.5) + 16) % 16);
    }

    public static byte directionDeltaX[] = new byte[] { 0, 1, 1, 1, 0, -1, -1,
            -1 };
    public static byte directionDeltaY[] = new byte[] { 1, 1, 0, -1, -1, -1, 0,
            1 };
    public static byte xlateDirectionToClient[] = new byte[] { 1, 2, 4, 7, 6,
            5, 3, 0 };
}

person Aleksandr    schedule 29.09.2014    source источник
comment
Вы не управляете памятью в java. Единственное, что вы можете изменить, это то, как часто производится сбор, я полагаю.   -  person jgr208    schedule 29.09.2014
comment
почему бы не использовать asci или unicode?   -  person Kick Buttowski    schedule 29.09.2014
comment
Где эта утечка памяти, и как вы знаете?   -  person Elliott Frisch    schedule 29.09.2014
comment
две вещи: 1) ваш код НАМНОГО длиннее, его никто не прочитает. 2) в java нет такой вещи, как утечка памяти. Это невозможно. Это утечка памяти: en.wikipedia.org/wiki/Memory_leak   -  person specializt    schedule 29.09.2014
comment
@specializt на самом деле это возможно. Однако единственный способ остановить это — изменить код, поскольку вы не можете управлять памятью.   -  person jgr208    schedule 29.09.2014
comment
Да, вы управляете памятью в Java, и в Java есть утечки памяти. Ссылаясь на уже не используемые объекты, вы можете создавать утечки памяти любого размера.   -  person Codo    schedule 29.09.2014
comment
@Codo, ты не можешь управлять памятью. Вы не управляете коллекцией с помощью malloc и unmalloc.   -  person jgr208    schedule 29.09.2014
comment
На самом деле в char нет утечки памяти, просто используется слишком много памяти, вот и все. Спасибо за ваши быстрые ответы люди.   -  person Aleksandr    schedule 29.09.2014
comment
Спасибо за ответы по переключателям. Я проверил visualvm в течение 12 часов, и на самом деле он использует слишком много памяти, вот и все.   -  person Aleksandr    schedule 29.09.2014
comment
лол ... эта ссылка просто показывает, как можно хранить недопустимые ссылки и получать к ним доступ, что приведет к исключению NullPointerException. Извините, но этот парень не знает, о чем говорит. Прочтите, пожалуйста, статью в википедии - она ​​вас просветит. Еще раз: невозможно создать утечку памяти с такими языками, как java; по дизайну.   -  person specializt    schedule 29.09.2014
comment
@specializt java.dzone.com/articles/java-memory-leak stackoverflow.com/questions/6470651/ oracle.com/technetwork/java/javase/memleaks-137499.html даже оракул подскажет, как их устранить.   -  person jgr208    schedule 29.09.2014
comment
даже если вы опубликуете это три раза подряд, это не изменит того факта, что утечек памяти нет. Утечки памяти — это поля, которые НЕ ДОСТУПНЫ и НЕ ОСВОБОЖДАЮТСЯ. Каждое поле доступно в java, по крайней мере, в пределах своей области — утечки памяти возможны только в том случае, если вы действительно можете ИЗОЛИРОВАТЬ ПАМЯТЬ — например, с помощью указателей памяти в C. Java освобождает каждое изолированное/недоступное поле.   -  person specializt    schedule 29.09.2014
comment
@specializt Однако автоматическое управление памятью может привести к снижению производительности и не устраняет все ошибки программирования, вызывающие утечку памяти.   -  person jgr208    schedule 29.09.2014
comment
вы не можете вызвать их каким-либо образом в java, но да: GC не сможет идти в ногу, если ваш код крайне ошибочен. Так обстоит дело с каждым алгоритмом на любом языке при любых обстоятельствах.   -  person specializt    schedule 29.09.2014
comment
@specializt Утечки памяти также включают ошибки, из-за которых объекты, которые устарели и больше не нужны, остаются, потому что где-то хранится непреднамеренная сильная ссылка.   -  person chrylis -cautiouslyoptimistic-    schedule 29.09.2014
comment
Извини, нет. Я собираюсь использовать определение из Википедии, потому что его используют все, а также то, которое придумал бы я. Если вы можете получить к нему доступ ЛЮБЫМ способом, это не утечка памяти - ваш GC может наверстать упущенное, если вы не переусердствуете.   -  person specializt    schedule 29.09.2014
comment
Этот аргумент на самом деле не будет продуктивным, поэтому я его подчистил. Если вы хотите продолжить это, могу я предложить вам сделать это в чате?   -  person Brad Larson    schedule 29.09.2014
comment
@BradLarson да, я согласен.   -  person jgr208    schedule 29.09.2014
comment
@specializt Вот интересный вопрос/ответ.   -  person Sotirios Delimanolis    schedule 29.09.2014
comment
@BradLarson эти комментарии могли бы быть связаны с большей очисткой - в основном это чепуха.   -  person Boris the Spider    schedule 30.09.2014


Ответы (1)


Обратите внимание, что метод подстроки может быть причиной утечек.

метод подстроки в классе String вызывает утечку памяти

Эта функция исправлена ​​в java 7u6.

person kemenov    schedule 29.09.2014
comment
Это комментарий, а не ответ. - person Boris the Spider; 29.09.2014
comment
в коде используется подстрока, есть вероятность, что причина в этом. - person kemenov; 29.09.2014
comment
В программировании хорошо то, что оно полностью детерминировано (за исключением многопоточности). Догадки не ценятся. Вы можете доказать, что это так? Возможно, недостаточно хорош. - person Boris the Spider; 30.09.2014