`
dyllove98
  • 浏览: 1384425 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38382
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:78748
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:131926
社区版块
存档分类
最新评论

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编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及         方法和构造方法的代码都在非堆内存中。 

分享到:
评论
2 楼 dyllove98 2012-05-31  
lengyimeng 写道
你好,我经常听到java中堆栈的的区别这样的问题,在你这篇文章看来,我是不是可以认为栈属于非堆存?或者说,能给我说下,堆、栈、非堆内存他们之间的关系吗?谢谢。

我个人认为 堆和非堆内存 是相对于java内存监控方面的,比如使用JConsole进行内存监控,你只能看到 堆内存是多少,非堆内存是多少.

在运行过程中, 栈的数据是属于非堆内存的.
1 楼 lengyimeng 2012-05-31  
你好,我经常听到java中堆栈的的区别这样的问题,在你这篇文章看来,我是不是可以认为栈属于非堆存?或者说,能给我说下,堆、栈、非堆内存他们之间的关系吗?谢谢。

相关推荐

    Java中堆内存与栈内存分配浅析

    本文分析了Java中堆内存与栈内存分配的异同

    Java中栈内存和堆内存详解

    Java中栈内存和堆内存详解,非常容易理解

    Java中堆内存和栈内存详解

    详细的讲解了java内存分配,包括运行时堆和栈内存的分配,变量和方法存储等

    Java栈内存与堆内存

    Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结

    java堆内存分析工具EclipseMemoryAnalyzer

    Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用 很有用!~

    深入Java核心 Java内存分配原理精讲

    Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域:  ◆寄存器:我们在程序中无法控制  ◆栈:存放基本类型的...

    优化Java堆内存大小的五个技巧

    GCJava性能调优JVMHeapJava编程语言 摘要:Java堆容量不足可以对性能造成很大...根据他多年的工作实践经验,他发现许多性能问题都是由Java堆容量不足和调优引起的。下面他将和大家分享非常实用的5个Java堆优化技巧。

    Java堆、栈和常量池——内存剖析

    Java堆、栈和常量池——内存剖析

    java实现内存动态分配

    Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量。虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都...

    《深入理解JAVA内存模型》PDF

    在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为...

    java内存机制 堆和栈.doc

    java内存机制 堆和栈

    java内存分配详解

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的 栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当...

    Java的内存机制(堆和栈)简单理解

    偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?  public class A{  public int i=1;  public static A a1 = new A();  public static void mian...  Java把内存分为堆内存

    深入Java内存分配

    Java有几种存储区域? java内存分配 Java内存模型 Java内存分配实例解析 String 常量池问题 堆(Heap)和非堆(Non-heap)内存 堆内存分配 非堆内存分配

    java内存分配之常量池,栈,堆1

    Java内存分配之堆、栈和常量池 Java内存分配主要包括以下几个区域:1. 寄存器:我们在程序中无法控制2. 栈:存放基本类型的数据和对象的引用,但对象本身不

Global site tag (gtag.js) - Google Analytics