一:
A a = new A();
当执行上面这样一个创建对象的语句时,虚拟机都会做什么呢?
1.检查参数A是否能在常量池中定位到一个类的符号引用。
2.检查这个符合引用代表的类是否已被加载、解析和初始化过。
3.否则,先执行相应的类加载过程。
4虚拟机为新生对象分配内存,那么就有个问题,在Java堆中,怎么划分内存呢?
a:指针碰撞,假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,
中间放着一个指针作为分界点的指示器,分配时,就将这个指针向空闲区域挪动需要的空间。
b:空闲列表,如果Java堆中内存不是规整的,可以有一个列表,把哪些是空闲的区域记录下来,分配的时候就从这个列 表里找呀。
那么你怎么知道会采用哪种呢,这其实就取决于GC机制了,如果是把有用的compact到一起,就是第一种
如果是标记-清扫,就是第二种。
5.分配内存时会有什么问题呢?
1.多线程,比如同时多个请求过来分配内存,可能会占用同一个,造成会去分配已经被分配了的空间。
怎么解决呢?
a:CAS+失败重试