作为java程序员对应Object应该是非常熟悉的,但是对于对象在JVM中的一些情况并不是很清楚,所以本文就来记录下对象在JVM中的一些内容
java程序中创建对象的常用方式是:
Object obj = new Object();
该行代码的执行过程如下:
从图中我们可以发现对象创建的步骤如下
在上面的过程中的类加载的过程,后面会单独介绍,而内存分配这块我们来介绍下
内存分配的基本原则:
序号 | 介绍 |
---|---|
1 | 优先在Eden分配,如果Eden空间不足虚拟机则会进行一次MinorGC |
2 | 大对象直接接入老年代,很长的字符串或数组 |
3 | 长期存活的对象进入老年代,每个对象都有一个age,当age到达设定的年龄的时候就会进入老年代,默认是15岁 |
内存分配的方法有两种:指针碰撞(Bump the Pointer)和空闲列表(Free List)
分配方法 | 说明 | 收集器 |
---|---|---|
指针碰撞 | 内存地址是连续的 | Serial和ParNew收集器 |
空闲列表 | 内存地址不连续 | CMS收集器和Mark-Sweep收集器 |
在分配内存的同时,存在线程安全的问题,即虚拟机给A线程分配内存过程中,指针未修改,B线程可能同时使用了同样一块内存。 在JVM中有两种解决办法:
建立对象是为了使用对象,java程序是通过栈上的reference数量来操作堆上的具体的对象,具体操作对象的方式有两种:
两种方式的比较
方式 | 优点 |
---|---|
句柄 | 稳定,对象被移动只要修改句柄中的地址 |
直接指针 | 访问速度快,节省了一次指针定位的开销 |
在我们常用的Sun HostSpot虚拟机而言就是使用的第二种方式,直接指针的方式来实现的。