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エラーが発生しています