0

SWIG を介して C++ クラスを Java に公開しています。valgrind で C++ クラスを個別にプロファイリングしましたが、メモリ リークの問題はありません。しかし、swig によって生成された JNI Java クラスを valgrind で実行すると、いくつかのメモリ リークが報告されます。

これがvalgrindを呼び出す方法です

LD_LIBRARY_PATH=/lib64/:. valgrind --trace-children=yes --smc-check=all --leak-check=full --show-reachable=yes java -Djava.compiler=NONE -Djava.library.path=.:/lib64/ -classpath yCRF.jar:. testYCRF

Valgrind エラーは次のとおりです。

==30758== 18 ブロックの 147,456 バイトは、731 の損失レコード 729 でまだ到達可能です
==30758== 0x4A069EE: malloc (vg_replace_malloc.c:270)
==30758== by 0x59927F6: os::malloc(unsigned long) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5489FCE: AllocateHeap(unsigned long, char const*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x57387A4: Hashtable::new_entry(unsigned int, Symbol*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A7D782: SymbolTable::basic_add(constantPoolHandle, int, char const**, int*, int*, unsigned int*, Thread*) (/home/y/libexec64/jdk1.7.0/jre/ 内) lib/amd64/server/libjvm.so)
==30758== by 0x5A7DBAF: SymbolTable::add(constantPoolHandle, int, char const**, int*, int*, unsigned int*, Thread*) (/home/y/libexec64/jdk1.7.0/jre/ 内) lib/amd64/server/libjvm.so)
==30758== by 0x55CE041: ClassFileParser::parse_constant_pool_entries(constantPoolHandle, int, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x55D26CF: ClassFileParser::parse_constant_pool(Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x55D4D2D: ClassFileParser::parseClassFile(Symbol*, Handle, Handle, KlassHandle, GrowableArray*, TempNewSymbol&, bool, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64 内) /server/libjvm.so)
==30758== by 0x55D9234: ClassLoader::load_classfile(Symbol*, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A87196: SystemDictionary::load_instance_class(Symbol*, Handle, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A87980: SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758==
==30758== 1 ブロックの 160,088 バイトは、731 の損失レコード 730 でまだ到達可能です
==30758== 0x4A069EE: malloc (vg_replace_malloc.c:270)
==30758== by 0x59927F6: os::malloc(unsigned long) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5AD4016: Universe_init() (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5757D24: init_globals() (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5ABB051: Threads::create_vm(JavaVMInitArgs*, bool*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x57B7C33: JNI_CreateJavaVM (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x4C3DF8D: JavaMain (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/jli/libjli.so 内)
==30758== by 0x311F607850: start_thread (pthread_create.c:301)
==30758== by 0x607A6FF: ???
==30758==
==30758== 1 ブロックの 456,768 バイトは、731 の損失レコード 731 でまだ到達可能です
==30758== 0x4A0577B: calloc (vg_replace_malloc.c:593)
==30758== by 0x66F3AC5: readCEN (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/libzip.so 内)
==30758== by 0x66F4295: ZIP_Put_In_Cache0 (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/libzip.so 内)
==30758== by 0x55DA3F8: ClassLoader::create_class_path_entry(char*, stat, ClassPathEntry**, bool) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x55DB1BE: LazyClassPathEntry::open_stream(char const*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x55D91B8: ClassLoader::load_classfile(Symbol*, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A87196: SystemDictionary::load_instance_class(Symbol*, Handle, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A87980: SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5A8869E: SystemDictionary::initialize_preloaded_classes(Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5AD4603: Universe::genesis(Thread*) (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5AD4AB3: Universe2_init() (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758== by 0x5757D7C: init_globals() (/home/y/libexec64/jdk1.7.0/jre/lib/amd64/server/libjvm.so 内)
==30758==
==30758== リークの概要:
==30758== 確実に失われました: 31 ブロックで 3,952 バイト
==30758== 間接的に失われた: 13 ブロックで 4,832 バイト
==30758== 失われた可能性: 399 ブロックで 163,507 バイト
==30758== まだ到達可能: 9,354 ブロックで 1,491,202 バイト
==30758== 抑制: 0 ブロックに 0 バイト

valgrind の完全な出力は、 https: //www.dropbox.com/s/ybx7e2nv5z0gqzi/valgrind.txt からアクセスできます。

私はこれらのリークの性質を理解しようとしています。彼らは私のコードを指していないようです。これらは本当に私が心配する必要があるエラーですか、それとも JNI の癖が原因で valgrind の動作がおかしくなっているのでしょうか?

EDIT JNIコンポーネントを一切使用せずに単純なJavaコードを試しました。

//import com.ycrf.Translit;

import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;

public class testYCRF {

public static void main(String[] argv) throws InterruptedException {
    List<String> words =
        Arrays.asList("hum", "jithine", "baap", "chasen"
                //"beti", "beta", "pragya", "hamara",
                //"tumara", "hindu", "hindi", "english"
                // "aag", "atulya", "ataah",
                //"adeergha",  "angootha", "ankan", "ankaganit"
                );

    //Translit tr = new Translit("../../tests/train-crf50K.model");
    for (String word : words) {
        //obj.transliterateWord(word);
    String transliterations = "boo";
        //tr.getTransliterations(word);
        System.out.println(word + ":" + transliterations);
    }
    //tr.delete();
}

}

同じvalgrindエラーが発生しています

4

0 に答える 0