注意:本篇博客,主要参考自以下三本书
《分布式Java应用:基础与实践》
《深入理解Java虚拟机(第二版)》
《突破程序员基本功的16课》
说明:关于JVM内存结构,查看《第一章 JVM内存结构》,下面所讲的JVM内存分配主要是指在Hotspot JVM下新建对象在堆内存中分配的情况。
1、创建一个真正对象的基本过程
五步:
2、内存分配概念
3、内存分配两种方式
4、内存分配并发问题
堆内存是各个线程的共享区域,所以在操作堆内存的时候,需要处理并发问题。处理的方式有两种:
5、总结
String s1 = "hello1"; String s2 = "hello2"; String s3 = "hello3"; String s4 = s1+s2+s3;
实际上,我们只想要字符串s1+s2+s3,但是在上述的拼接过程中,会形成s1+s2的临时字符串。拼接字符串,使用StringBuilder,该类相较于StringBuffer由于不是同步类,其运行效果会更好。
public void info(){ Object obj = new Object(); System.out.println(obj.hashCode()); obj = null;//显式释放无用对象 }
如上边方法所示,其中的obj是一个局部变量,在方法执行结束后,栈帧就会出栈并被回收,栈帧中所存储的局部变量一起被回收掉了,所以这里的"obj=null;"就没用了,但是看下边
public void info(){ Object obj = new Object(); System.out.println(obj.hashCode()); obj = null;//显式释放无用对象 //下边还有一些很耗时、很耗内存的操作,这些操作与obj无关 }
这时候,如果我们加上了"obj=null;"这一句,那么就有可能在方法执行结束之前,obj被回收。