堆
(所有类的实例或数组,一种实现:分为句柄池和对象池(方便对象移动改变,但有两个指向),对象的引用就是指向句柄池,句柄池有两部分:一个是对象实例;一个是方法区中类的信息。对象池,当然放的是对象实例。第二种实现:直接指向一组数据,数据中包含所有-对象实例和方法区中类的信息)
方法区
(被装载类型的信息,如字段信息,方法信息,除常量外的类属性,classLoader的引擎,class类的引用)
栈
(jvm会为每个线程分配一个栈,栈是分为栈帧,每调用一个方法就压入一个新栈帧,作为当前帧,使用)
栈帧
(栈帧由局部变量区,操作数栈,栈帧数据区组成。局部变量区,操作数栈都是有一个以字长为单位的数组组成
局部变量区是用索引来访问,操作数栈有压栈出栈操作调用。栈帧包含一些栈帧常量池,异常派发机制)
java的堆和方法去是所有线程共享的,栈所属一个线程,他们的实际物理空间都可以不连续,分配的物理空间
大小一般由方法区中的信息决定。这里栈一般分配到新生代E 的1%。
java通过监视器机制实现同步,堆和方法区是线程共享的,栈是一个线程独有的。
监控过程未:
进入monitor
获得monitor
持有monitor
释放monitor
离开monitor
在功能上,同步分为两方面:互斥和协作
互斥是用只允许一个进程计入监控器区域,其他需要在等待区实现的。
协作是用wait notify实现
每个类和对象都有一个监控器。
对象锁
重入性,jvm维护一个计数器,当线程获得锁,记录为1,只允许这个线程加锁。当计数器为0时,表示没有对象持有锁。
java内部锁 synchronize
在进入同步块时,进入块时调用monitorenter 出同步块调用monitorexit
同步方法 , 则在解析方法符号时,判断出需要调用对象锁(如果是类方法,就调用类锁)
java包下的一些好东西
http://rdc.taobao.com/team/jm/archives/414
在贴一个将lock的
http://suo.iteye.com/blog/1331312