JVM-内存管理及创建对象

来源:互联网 发布:华为云计算平台 编辑:程序博客网 时间:2024/06/05 16:43

线程运行的数据区


隔离区(随线程而生而灭)

程序计数器

        程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

虚拟机栈

        同样是线程私有。虚拟机栈描述每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量、操作数栈、动态链接、方法出口等信息。
        局部变量表存放编译期可知的各种基本数据类型(8大基本类型)、对象引用(reference类型)和returnAddress类型(指向字节码指令的地址)。

本地方法栈

        类似虚拟机栈,区别是虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机执行Native方法服务。

        我们熟悉的HotSpot虚拟机将本地方法栈和虚拟机栈合并了。

共享区(死掉的对象会被回收)

java堆Java Heap

        是虚拟机管理的内存最大的一块。是被所有线程共享的一块内存区域,在虚拟机启动时创建。可以存放被实例的对象。这里的对象具有生命周期,所以可以被垃圾收集器回收空间。
        分为:新生代和老年代。新生代再细分就是Eden、From survivor、To survivor,后面有机会还会介绍到。
        java堆的内存可以进行扩展,如果规定该空间不能被扩展,需要将参数-Xmx和-Xms设置的值一样,这样就限定了java堆扩展。

方法区(非堆)

        也是被线程共享的一块内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。大部分时候称为永久代,因为这样可以把GC分代收集扩展到方法区。

        垃圾收集行为在方法区很少出现,但也会收集常量池和对类型卸载。


异常

        以上除了程序计数器之外,其他所有的数据区都可能会产生异常。有两个异常:StackOverflowError异常(线程私有区)和OutOfMemoryError异常(除程序计数器以外的所有区),根据我做的实验,大部分产生的异常都是OutOfMemoryError异常。例如java堆不能进行扩展,并且堆没有内存完成实例分配,就会产生OOM异常。

补充:

        栈帧是方法运行时的基础数据结构
        两个异常:1、线程请求了栈深度超过虚拟机允许最大数:stackOverflowError;
        2、虚拟机栈动态扩展,申请不到足够内存,outofMemoryError异常。

        运行时常量池是方法区的一部分。


        以上简单描述了一下JVM内存的管理及各部分作用,下面通过创建一个对象,来看看这个过程在内存中的活动。


一、对象产生

        通过执行一个NEW操作
        根据参数在常量池中定位到一个类的符号引用,检查该类是否被加载、解析初始化
                        没有:执行类加载,init方法
                        有:新对象分配内存

        从java堆中分配一块与对象大小相等的内存
        根据堆的规整程度,有指针碰撞、空闲列表两种内存分配方式

二、对象布局

                

三、对象的访问定位

        以reference类型为例:栈上的reference数据操作堆上的具体对象。

        访问方式:句柄、直接指针


                

        句柄:在堆中会有一个句柄池,reference存储对象的句柄地址,句柄池中的句柄包含对象实例数据地址(堆)和类型数据地址(非堆)。

                
        直接指针:reference中放的就是对象地址,在对象中有对象类型数据地址

        对比:各有优势,句柄的好处是对象被移动,只改句柄不改栈中reference,比较稳定;直接指针访问速度快,但是访问频繁;

        在虚拟机HotSpot中使用的是直接指针访问方式,但是从整个软件开发的范围来看,各种语言和框架使用句柄来访问的情况也十分常见。

总结:做java开发理解JVM的基本知识就像是吃饭会用筷子一样,基础而又有帮助。尤其是知道的多了,出了问题,你是可以通过排查从根源上找到解决方法的。

原创粉丝点击