您的位置:首页 > 编程语言 > Java开发

Java内存布局和类加载的一些总结

2016-12-16 09:15 423 查看
Java内存布局和类加载的一些总结

对C++程序的内存布局比较清楚,但是对java程序的内存一直比较模糊,原因是个人一直不大重视对java的深入学习,这可能也是一部分学习C++出身的人的傲慢与偏见的表现,这两天根据以前对C++内存模型和链接机制的经验,对java的内存布局和类加载机制(某种程度用动态链接的方式替代了C++静态链接的作用)做了些总结。

Java程序从大的角度划分,分成三大区

栈区:这个跟C++没什么区别,就是程序运行时的数据结构,按照指令的顺序进行入栈出栈操作,依赖于程序计数器。

堆区:跟C++也没什么区别,就是程序运行时new出来的对象放置的区域,和C++的区别就是不用在程序代码中手工释放内存,而是由java的GC自动回收。

方法区:感觉是C++中全局数据区和代码区的合集,和C++的区别是java由于是动态加载链接机制,所以方法区中还存了一份C++所没有的类信息,用于支持java的动态链接。

Java的类加载机制,由于之前一直是C++的概念,所以对java的类加载机制不是很清楚,因为C++中并没有类加载的概念,C++是静态链接的语言,所有的链接在程序运行前执行完毕,也就意味着所有的偏移量和对象大小(即使是动态在堆内存创建的对象,也是在编译和链接的时候用常量替换掉sizeof(类),确定运行时分配的内存大小)在程序运行前设置完毕。而不是像java那样在程序运行时需要时才进行动态加载和分配对象的内存空间。所以java在类加载时保存了类的完整信息,包括静态成员,成员变量,成员方法,在程序运行时根据这些信息完成在堆内存上分配内存和确定使用该对象所属类的成员方法的地址。值得一提的是java的方法区中有个常量池的概念,java的常量池跟C++的全局数据区不同,除了保存着普通常量外,还保存着对类型,域,方法的引用,简单来说就是起着跟C++符号表一样的作用,在C++中符号表在链接的环节起关键的作用,最终确定各个对象和变量以及函数的全局偏移量,java方法区中常量池也是在动态链接中起着类似的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: