我觉得是根据应用方式 和本身特性 才将内存分区的,目的是提高效率 和方便管理 等
栈的特点是容量小,速度快,可能昂贵,就适合放置静态,全局等小且需要经常访问但不怎么变化的数据
堆的特点是容量大,速度慢,可能便宜,就适合放置动态分配的数据,因为动态分配的数据不确定且容量大,数量多,比如对象,生存期相对较短,就以无序状态存储于堆中。
像方法区之类是堆的一部分,我觉得更多是因为业务逻辑上便于分类管理的需要而应运而生的
详细可看:
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html
http://www.maxi-pedia.com/what+is+heap+and+stack