JVM富有争议的观点总结以及一些概念理解
JVM富有争议的观点总结以及一些概念理解
JVM表现根据JDK版本不同具有一定的差异
JVM常量池,静态变量等存储的位置与内存图表示
常用的JDK版本JDK1.7与JDK1.8具有无论是1.8新增optional包装类,lamda表达式,Stream类等流式编程还是JVM的内存内存模型都有较大区别,很多人还是无法区分常量池的位置和静态变量存储的位置,下面本人抛砖引玉介绍下自己的观点(研读深入理解java虚拟机):
-
JDK1.7内存模型 (图片来源于网络)
这与<<深入理解java虚拟机>>第二版内存模型是吻合的,标准的1.7版本,此时的常量池,静态变量位于方法区(同时还包括类信息,编译器编译后的代码等数据),java规范中把方法区描述为堆的一个逻辑部分,但是跟堆是隔离开的,值得一提的是还有一个点:堆内存细分可划分为新生代和老年代,并不包括持久代,持久代存在于方法区中,可以通过参数-XX:MaxPermSize,-XX:PermSize控制其大小; -
JDK1.8内存模型(图片来源于网络)
JDK1.8以后,持久代被移除掉,取而代之的是元空间,无论是持久代或者是元空间都是对方法区的具体实现,方法区是JVM规范中的概念,最大的区别是元空间使用的是本地内存(系统内存),持久代的东西移动到metaspace中,静态成员变量和常量池移动到堆内存法区是不是就不属于虚拟机内存的一部分了?还是元空间只是方法区的一部分,还有一部分东西存放在方法区中?待了解。
内存泄露与内存溢出
内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长。更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等。
内存溢出即用户在对其数据缓冲区操作时,超过了其缓冲区的边界;尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常。