Clean up mutexes on shutdown.

Change-Id: Ib961f954280c27f8858c4d6fb9010cc833bb28d2
diff --git a/src/class_linker.h b/src/class_linker.h
index 34ad9d7..90ac678 100644
--- a/src/class_linker.h
+++ b/src/class_linker.h
@@ -24,7 +24,9 @@
   // Initializes the class linker.
   static ClassLinker* Create(const std::vector<DexFile*>& boot_class_path);
 
-  ~ClassLinker() {}
+  ~ClassLinker() {
+    delete classes_lock_;
+  }
 
   // Finds a class by its descriptor name.
   // If class_loader is null, searches boot_class_path_.
diff --git a/src/intern_table.cc b/src/intern_table.cc
index 3a0dff8..3ef5917 100644
--- a/src/intern_table.cc
+++ b/src/intern_table.cc
@@ -10,6 +10,10 @@
   intern_table_lock_ = Mutex::Create("InternTable::Lock");
 }
 
+InternTable::~InternTable() {
+  delete intern_table_lock_;
+}
+
 void InternTable::VisitRoots(Heap::RootVistor* root_visitor, void* arg) {
   MutexLock mu(intern_table_lock_);
   typedef Table::const_iterator It; // TODO: C++0x auto
diff --git a/src/intern_table.h b/src/intern_table.h
index 61da28b..0a1554d 100644
--- a/src/intern_table.h
+++ b/src/intern_table.h
@@ -13,6 +13,7 @@
 class InternTable {
  public:
   InternTable();
+  ~InternTable();
   String* Intern(int32_t utf16_length, const char* utf8_data);
   void VisitRoots(Heap::RootVistor* root_visitor, void* arg);
 
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index c538670..586b541 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -2583,4 +2583,9 @@
       weak_globals(kWeakGlobalsInitial, kWeakGlobalsMax, kWeakGlobal) {
 }
 
+JavaVMExt::~JavaVMExt() {
+  delete globals_lock;
+  delete weak_globals_lock;
+}
+
 }  // namespace art
diff --git a/src/jni_internal.h b/src/jni_internal.h
index 1a4235d..a6fce05 100644
--- a/src/jni_internal.h
+++ b/src/jni_internal.h
@@ -21,6 +21,7 @@
 
 struct JavaVMExt {
   JavaVMExt(Runtime* runtime, bool check_jni, bool verbose_jni);
+  ~JavaVMExt();
 
   /*
    * Load native code from the specified absolute pathname.  Per the spec,