`
123003473
  • 浏览: 1064084 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java的堆与非堆内存

    博客分类:
  • java
 
阅读更多
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首 先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然 可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。


2.为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:

1)参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

2)-Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说 到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

3.为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:

参数形如“项值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vmC:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:

-vm  C:\Java\jre1.6.0\bin\javaw.exe   按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:

-vmargs  -Xms128M  -Xmx512M  -XX:PermSize=64M -XX:MaxPermSize=128M 实际运行的结果可以通过Eclipse中“Help”-“AboutEclipseSDK”窗口里面的“ConfigurationDetails”按钮进行查看。

另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:

-showsplash  org.eclipse.platform  --launcher.XXMaxPermSize  256m  -vmargs  -Xms40m  -Xmx256m  其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得 唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里 可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

3.其他的启动参数。如果你有一个双核的CPU,也许可以尝试这个参数:

-XX:+UseParallelGC  让GC可以更快的执行。(只是JDK5里对GC新增加的参数)


【转载地址】http://zhaohe162.blog.163.com/blog/static/382167972011101061417497/

JVisualVM安装插件:
http://jiajun.iteye.com/blog/1180230
分享到:
评论

相关推荐

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

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    从JAVA代码到JAVA堆(应用程序内在的使用量与最佳化)日文版

    这包括理解Java堆与非堆内存的差异、合理配置内存参数、选择合适的集合类型、减少不必要的内存使用以及利用各种分析工具识别内存瓶颈。通过以上这些知识点的学习和应用,开发者可以有效减少应用程序的内存占用,提升...

    Java中堆内存和栈内存详解

    与栈内存不同,堆内存中的对象生命周期不受作用域限制。具体而言: - **对象存储**:每当使用`new`关键字创建一个新的对象时,该对象就会被分配在堆内存中。 - **对象引用**:为了访问堆内存中的对象,可以在栈内存...

    Java堆内存管理:深入解析与代码实践

    Java堆内存是Java虚拟机(JVM)中最大的一块内存区域,主要用于存储对象实例和数组。理解堆内存的划分、分配机制和垃圾回收过程对于Java开发者来说至关重要,因为这些知识可以帮助他们优化应用程序的性能,避免内存...

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

    1. **理解默认值与自定义配置**:每个JVM都有默认的堆内存大小,但这个默认值可能并不适合所有应用。你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆内存和最大堆内存。例如,`-Xms256m -Xmx1024m`将初始堆设置为...

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

    【标题】:深入理解Java内存使用与优化:从代码到Java堆 【描述】:本文旨在帮助Java开发者深入了解从编写代码到Java堆的内存管理过程,以便更好地优化应用程序的内存使用。通过分析Java代码中的内存开销,以及讨论...

    java堆内存分析工具EclipseMemoryAnalyzer

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

    Java堆外内存的使用Java开发Java经验技巧共5页

    堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...

    Java堆外内存泄露场景总结.pdf

    Java堆外内存泄露场景总结,包含几个常用的可能,如:JNI,NIO,AWT/Swing,Inflater&Deflater;

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

    ### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...

    Java中栈内存和堆内存详解

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

    Java栈内存与堆内存

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

    Java内存机制学习和使用

    除了Java堆内存之外,Java应用程序还需要使用到**本机内存**(Native Memory),这是指JVM之外的内存,主要用于存储JVM自身的元数据、线程栈以及一些非Java对象的数据结构。 - **元数据**:包括类定义、字段信息、...

    java内存机制及异常处理

    常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间不足)和`java.lang.StackOverflowError`(栈溢出)。这些错误通常由于物理...

    Java堆内存最佳实践.pdf

    Java堆内存管理是Java应用程序性能优化的关键环节。堆内存主要存放对象实例,其大小直接影响了垃圾收集(GC)的频率和效率。本节主要探讨如何通过GC日志、工具分析来理解和优化Java堆内存的使用。 堆分析对于理解GC...

    IBMJava堆内存分析套件

    IBMJava堆内存调优套件,可以协助内存泄露排查

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

    3. **堆**: 堆内存是Java应用程序中最大的一块内存,主要用于存储new关键字创建的对象和数组。堆内存的大小可以动态调整,由JVM管理。对象在堆中分配,当不再有引用指向它们时,垃圾回收器会自动回收这些内存。由于...

Global site tag (gtag.js) - Google Analytics