title: clojure的Var和Namespace在内存中的布局 date: 2015-02-03 11:09:10 categories: clojure
tags: [clojure, java]
Clojure中,Var和Namespace的内存布局。
Layout of Var
/** Layout of Var:
每个线程都有自己的一套形如下图的Var存储布局,即这套内容是ThreadLocal的。
ThreadLocal<Frame> dvals
|
TOP v
+----------+ +----------+ +----------+
| null | <---- | prev | <--- .... <--- | prev |
+----------+ +----------+ +----------+
| bindings | | bindings | | bindings |
+----------+ +----------+ +----------+
| | |
| | |
v v v
PersistentHashMap.EMPTY +-------+--------+ +-------+--------+
| var_0 | thread | | var_0 | thread |
| | val_0 | | | val_0 |
+-------+--------+ +-------+--------+
| var_1 | thread | | var_1 | thread |
| | val_1 | | | val_1 |
+-------+--------+ +-------+--------+
| var_2 | thread | | var_2 | thread |
| | val_2 | | | val_2 |
+-------+--------+ +-------+--------+
| ....... | | var_3 | thread |
+----------------+ | | val_3 |
+-------+--------+
| ....... |
+----------------+
*/
Layout of Namespace
/** Layout of Namespace:
namespace 是全局的,mappings, aliases是依附于单独Namespace对象的。
mappings
map: Symbol -> Var
+-----> +--------+---------+
| | quote | Var obj |
| +------------------+
| | vector | Var obj |
| +------------------+
| | cons | Var obj |
| +--------+---------+
namespace | | . . . . . . |
| +------------------+
map: Symbol -> Namesapce |
+--------------+---------------+ |
| clojure.core | Namespace ojb | ----+ +--> +--------+---------+
+--------------+---------------+ | | var_0 | Var obj |
| user | Namespace obj | -------+ +--------+---------+
+--------------+---------------+ | var_01 | Var obj |
| | +--------+---------+
| . . . . . . | | var_02 | Var obj |
| | +--------+---------+
+--------------+---------------+ | . . . . . . |
| other nsname | Namespace obj | ------+ +------------------+
+--------------+---------------+ |
+---> +--------+---------+
| var_0 | Var obj |
+--------+---------+
| var_01 | Var obj |
+--------+---------+
| var_02 | Var obj |
+--------+---------+
| . . . . . . |
+------------------+
aliases
map: Symbol -> Namesapce
+--------------+---------------+
| alias_0 | Namespace ojb |
+--------------+---------------+
| alias_1 | Namespace obj |
+--------------+---------------+
| |
| . . . . . . |
| |
+--------------+---------------+
| alias_n | Namespace obj |
+--------------+---------------+
*/