运行时数据区:方法区,堆,虚拟机栈、本地方法栈、程序计数器。
对于每?个线程来说,栈都是私有的,?堆是共有的。
也就是说在栈中的变量(局部变量、?法定义参数、异常处理器参数)不会在线程之间共享,也就不会有内存可?性(下?会说到)的问题,也不受内存模型的影响。?在堆中的变量是共享的,本?称为共享变量。所以,内存可?性是针对的共享变量。
线程之间的共享变量存在主内存中,每个线程都有?个私有的本地内存,存储了该线程以读、写共享变量的副本。本地内存是Java内存模型的?个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器等。
区别
两者是不同的概念层次。JMM是抽象的,他是?来描述?组规则,通过这个规则来控制各个变量的访问?式,围绕原?性、有序性、可?性等展开的。?Java运?时内存的划分是具体的,是JVM运?Java程序时,必要的内存划分。
联系
都存在私有数据区域和共享数据区域。?般来说,JMM中的主内存属于共享数据区域,他是包含了堆和?法区;同样,JMM中的本地内存属于私有数据区域,包含了程序计数器、本地?法栈、虚拟机栈。
实际上,他们表达的是同?种含义,这?不做区分。
局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储于堆中。—— 因为它们属于方法中的变量,生命周期随方法而结束。
成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体)—— 因为它们属于类,类对象终究是要被new出来使用的。
内存泄漏的原因
1、静态集合类引起的内存泄漏。对象无法回收。
2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
3、监听器未删除。
4、各种连接未释放
5、部类和外部模块的引用
6、单例模式对象持有外部引用
原文:https://www.cnblogs.com/chenfx/p/14618812.html