首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java内存储器和非堆内存

2012-08-27 
java内存和非堆内存?内存Java 虚拟机的内存系统管理以下类型的内存:1. 堆Java 虚拟机具有一个堆,堆是运行

java内存和非堆内存

?

内存

Java 虚拟机的内存系统管理以下类型的内存:

1. 堆

Java 虚拟机具有一个,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为垃圾回收器?的自动内存管理系统回收。

堆的大小可以固定,也可以扩大和缩小。堆的内存不需要是连续空间。

2. 非堆内存

Java 虚拟机管理堆之外的内存(称为非堆内存)。

Java 虚拟机具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机启动时创建的。

方法区在逻辑上属于堆,但 Java 虚拟机实现可以选择不对其进行回收或压缩。与堆类似,方法区的大小可以固定,也可以扩大和缩小。方法区的内存不需要是连续空间。

除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。

内存池和内存管理器

内存池内存管理器均是抽象实体,对 Java 虚拟机的内存系统进行管理和监视。

内存池表示 Java 虚拟机管理的内存区域。Java 虚拟机至少有一个内存池,而且可以在执行期间创建或删除内存池。内存池可以是堆内存,也可以是非堆内存。

内存管理器负责管理一个或多个内存池。垃圾回收器就是一种内存管理器,负责回收不可到达对象占有的内存。Java 虚拟机可以有一个或多个内存管理器。可以在运行期间添加或删除内存管理器。一个内存池可以由多个内存管理器进行管理。

内存使用量监视

对于内存系统而言,内存使用量是一个非常重要的监视属性。例如,内存使用量可以指示:

    应用程序的内存使用量,自动内存管理系统上的工作负载,潜在的内存泄漏。

    可以采用三种方式监视内存使用量:

      轮询使用量阈值通知集合使用量阈值通知

      具体细节在?MemoryPoolMXBean?接口中指定。

      内存使用量监视机制旨在用于负载平衡或工作负载分布。例如,应用程序在其内存使用量超过特定阈值时,可以停止接收任何新的工作负载。它不适合用于供应用程序进行检测或从低内存情况恢复。

      ?

      ------------

      在JVM中堆之外的内存称为非堆内存(Non-heap memory)

      ? ? ? 非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及 ? ? ? ? 方法和构造方法的代码都在非堆内存中。?

      1 楼 lengyimeng 2012-05-31   你好,我经常听到java中堆栈的的区别这样的问题,在你这篇文章看来,我是不是可以认为栈属于非堆存?或者说,能给我说下,堆、栈、非堆内存他们之间的关系吗?谢谢。 2 楼 dyllove98 2012-05-31   lengyimeng 写道你好,我经常听到java中堆栈的的区别这样的问题,在你这篇文章看来,我是不是可以认为栈属于非堆存?或者说,能给我说下,堆、栈、非堆内存他们之间的关系吗?谢谢。
      我个人认为 堆和非堆内存 是相对于java内存监控方面的,比如使用JConsole进行内存监控,你只能看到 堆内存是多少,非堆内存是多少.

      在运行过程中, 栈的数据是属于非堆内存的.

热点排行