人们都说:java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。
对于C/C++开发人员来说,他们有着对内存管理的最高权限。所以他们要对每个对象生命的开始到终结都要维护,而且经常会碰到内存泄漏内存溢出等问题;而java开发人员就显得轻松许多,因为有虚拟机的内存管理机制帮助做了很多事情,不再需要每个人创建的操作对应删除操作,当然也不太容易出现内存泄漏和内存溢出的问题。
虽然虚拟机给我们来管理内存,java开发人员的工作变得更加轻松,然而当出现内存泄漏和内存溢出的问题的时候,如果不了解虚拟机管理内存的机制,那么排错就会变成java程序员的一场噩梦。
Java虚拟机执行java程序过程中吧内存分为若干个不同数据区域。
1. 程序计数器: 可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值选取下一条需要执行的字节码指令。每个线程需要一个独立的程序计数器。这块内存区域为线程私有的内存
2. java虚拟机栈:是线程私有的,生命周期与线程相同。它描述的java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程就对应一个栈帧在虚拟机栈中从入栈道出栈的过程。两种异常:如果线程请求的栈深度大于虚拟机所允许的深度抛出stackoverflowError;如果虚拟机栈可以动态扩展,当扩展无法申请到足够的内存时抛出outofmemoryError异常
3. 本地方法栈【这个有点不太理解,需要读者明白的给留言哦】:虚拟机栈执行java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
4. java堆:是java虚拟机所管理的内存中最大的一块。是被所有线程共享的。在虚拟机启动时候创建。存放对象实例。java堆是垃圾收集器管理的主要区域。
5. 方法区:所有线程共享的内存区域,用于存储被虚拟机加载的类信息、常亮、静态变量、即时编译器编译后的代码等数据。
6. 运行时常量池:是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述外还有就是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在加载后存放到方法去的运行时常量池。
从上面的介绍能够明白虚拟机里面的内存是如何划分的,那部分区域做什么样的任务。只有知道这些才有可能明白java的垃圾收集器机制,才能有可能在内存出现溢出或泄漏的时候,能够快速定位并且解决。

451

被折叠的 条评论
为什么被折叠?



