JAVA与C++之间有一堵由内存动态分配和垃圾收集技术围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。

                                              ——《深入理解java虚拟机》周志明

虚拟机运行时数据区:

java虚拟机设置生成内存快照的参数 java虚拟机默认内存大小 linux_垃圾收集

各区域作用简介:

1.程序计数器:“线程私有”,执行本地native方法时为空,唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2.虚拟机栈:“线程私有”,是方法调用过程中的各种信息的出入栈。

3.本地方法栈:与上者相似,为本地方法服务。

4.java堆:“线程共享”,存放对象实例,垃圾回收器管理的主要区域。

5.方法区:存储已加载的类信息、常量、静态变量等,也称作“永久代”。HotSpot的垃圾收集器也像管理堆一样管理这部分内存。

6.运行时常量池:方法区的一部分。了解比较多被利用的String类的intern()方法。

7.直接内存:不属于虚拟机运行时数据区的一部分,在JDK1.4中加入的NIO(New Input/Output)类中有应用。

 

对象的创建:

1.检查类是否已被加载、解析和初始化。

2.根据加载类后完全确定的内存大小为对象分配空间,“指针碰撞”和“空闲列表”两种不同的分配方式对应不同的垃圾收集机制。

  线程安全解决方案:一、同步处理,CAS+失败重试,保障原子性。二、TLAB(本地线程分配缓冲)

3.初始化内配好的内存为零值。设置对象头(包含对象属于哪个类、如何找到类的元数据信息、对象的哈希码、分代年龄等信息)。

4.对象产生,执行<init>方法。

 

对象的内存布局:对象头,实例数据,对其填充。

对象的访问定位:句柄方式,对象被移动(垃圾收集时非常普遍的行为)时无需更改reference,只需更改句柄中的实例数据指针。在框架中常见使用。

        直接指针方式:节省一次指针定位的开销,在Sun HotSpot中使用这种方式。