java堆内存剩余多少合理_Java堆内存的10个要点

导读:对于程序员来说,知道堆空间,设置堆空间,处理堆空间的outOfMemoryError错误,分析heap dump是非常重要的。文中介绍了Java堆的学习教程以及Java堆内存(heap memory)的十个要点。

刚开始学习Java编程时,可不知道什么是堆内存或堆空间(heap space),甚至根本不管对象创建时都放在那里去了。正式写一些程序后,经常会遇到java.lang.outOfMemoryError等错误,才开始关注堆内存。

对大多数程序员都经历过这样的过程,因为学习一种语言非常容易来的,但是学习基础是非常难得,因为没有什么特定的流程让你学习编程的每个基础,使你发觉编程的秘诀。

对于程序员来说,知道堆空间,设置堆空间,处理堆空间的outOfMemoryError错误,分析heap dump是非常重要的。这个关于Java堆的给刚开始学编程的看的。如果你知道这个基础知识或者知道底层发生什么,当然可能帮助不是那么大。除非你知道了对象被创建在堆中,否则你不会意识到OutOfMemoryError是发生在堆空间中的。我尽可能的将我所知道的所有关于堆的知识都写下来了,也希望尽可能多的贡献和分享你的知识,一变可以让其他人耶受益。

Java中的堆空间是什么?

当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,向上排列。当一个对象通new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不在使用,被当着垃圾回收掉后,这些内存又重新回到堆内存中。

如何增加Java堆空间?

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32位Solaris操作系统上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xms=64M。对于64位操作系统,一般堆空间大小增加约30%.但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分一。要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VM Summary页面可以看到最大的堆大小。

用这种方法你可以根据你的程序的需要来改变堆内存大小,强烈建议采用这种方法而不是默认值。如果你的程序很大,有很多对象需要被创建的话,你可以用-XMS and Xmx这两个参数来改变堆内存的大小。Xms表示起始堆大小,Xmx表示最大的堆内存的大小。另外有一个参数-Xmn,它表示new generation的大小。有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM设定它。

堆和垃圾回收

我们知道对象创建在堆内存中,垃圾回收这样一个进程,它将已死对象清除堆空间,并将这些内存再还给堆。为了给垃圾回收器使用,对主要被分成三个区域,分别叫作New Generation,Old Generation 或叫Tenured Generation,以及Perm space。New Generation是用来存放新建的对象的空间,在对象新建的时候被使用。如果长时间还使用的话,它们会被垃圾回收器移动到Old Generation(或者叫Tenured Generation)。perm space是JVM存放Meta数据的地方,例如类,方法,字符串池和类级别的详细信息。你可以查看"Java中垃圾回收的工作原理"来获得更多关于堆和垃圾回收的信息。

Java堆中的OutOfMemoryError错误

当JVM启动时,使用了-Xms参数设置的堆内存。当程序继续进行时,创建更多对象,JVM开始扩大堆内存以容纳更多的对象。JVM也会使用垃圾回收器回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,JVM就会抛出java.lang.outofmemoryerror,你的程序就会挂掉。在抛出OutOfMemoryError之前,JVM会尝试着用垃圾回收器释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误。为了解决这个问题,你需要清楚你的程序对象的信息,例如,你创建了那些对象,哪些对象占用了多少空间等等。你可以使用profile或堆分析器来处理outofMemoryError错误。"java.lang.OutOfMemoryError.Java heap space"表示堆没有足够的空间了,不能继续扩大了。"java.lang.OutOfMemoryError.PermGen space"表示permanent generation已经装满了,你的程序不能再装载类或者分配一个字符串了。

Java Heap dump

Heap dump是在某一时间对Java堆内存的快照。它对于分析堆内存或者处理内存泄露和java.lang.outofmemoryerror错误是非常有用的。在JDK中有一些工具可以帮你获取heap dump,也有些堆分析工具来帮你分析heap dump。你可以用"jmap"来获取heap dump,它帮你创建heap dump文件,然后,你可以用"jhat"(堆分析工具)来分析这些heap dump。

Java堆内存(heap memory)的十个要点

Java堆内存是操作系统分配给JVM的内存一部分。

当我们创建对象时,它们存储在Java堆内存中。

为了便于垃圾回收,Java堆空间分成三个区域,分别叫作New Generation,Old Generation或叫作Tenured Generation,还有就是Perm Space。

你可以通过JVM的命令行选项—Xms,-Xmx,-Xmn来调整Java堆空间的大小。不要忘了在大小后面加上"M"或者"G"来表示单位,举个例子,你可以用-Xmx256m来设置堆内存最大的大小为256MB。

你可以用JConsole或者Runtime.maxMemory(),Runtime.totalMemory(),Runtime.freeMemory()来查看Java中堆内存的大小。

你可以使用命令"jmap"来获得heap dump,用"jhat"来分析heap dump。

Java堆空间不同于栈空间,栈空间是用来储存调用栈和局部变量的。

Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来,再释放到Java堆空间中。

当你遇到java.lang.OutOfMemoryError时,不要紧张,有时候仅仅增加堆空间就可以了,但是如果经常出现的话,就要看看Java程序中是不是存在内存泄露了。

请你使用profiler和heap dump分析工具查看Java堆空间,可以查看给每个对象分配了多少内存。

参考文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java8新特性及实战视频教程完整版Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda 表达式可以使代码变的更加简洁紧凑。Java8实战视频-01让方法参数具备行为能力Java8实战视频-02Lambda表达式初探Java8实战视频-03Lambda语法精讲Java8实战视频-04Lambda使用深入解析Java8实战视频-05Lambda方法推导详细解析-上.wmvJava8实战视频-06Lambda方法推导详细解析-下Java8实战视频-07Stream入门及Stream在JVM中的线程表现Java8实战视频-08Stream知识点总结Stream源码阅读Java8实战视频-09如何创建Stream上集Java8实战视频-10如何创建Stream下集.wmvJava8实战视频-11Stream之filter,distinct,skip,limit,map,flatmap详细介绍Java8实战视频-12Stream之Find,Match,Reduce详细介绍Java8实战视频-13NumericStream的详细介绍以及和Stream之间的相互转换Java8实战视频-14Stream综合练习,熟练掌握API的用法Java8实战视频-15在Optional出现之前经常遇到的空指针异常.wmvJava8实战视频-16Optional的介绍以及API的详解Java8实战视频-17Optional之flatMap,综合练习,Optional源码剖析Java8实战视频-18初识Collector体会Collector的强大Java8实战视频-19Collector使用方法深入详细介绍-01Java8实战视频-20Collector使用方法深入详细介绍-02Java8实战视频-21Collector使用方法深入详细介绍-03.wmvJava8实战视频-22Collector使用方法深入详细介绍-04Java8实战视频-23Collector原理讲解,JDK自带Collector源码深度剖析Java8实战视频-24自定义Collector,结合Stream的使用详细介绍Java8实战视频-25Parallel Stream编程体验,充分利用多核机器加快计算速度Java8实战视频-26Fork Join框架实例深入讲解Java8实战视频-27Spliterator接口源码剖析以及自定义Spliterator实现一个Stream.wmvJava8实战视频-28Default方法的介绍和简单的例子Java8实战视频-29Default方法解决多重继承冲突的三大原则详细介绍Java8实战视频-30多线程Future设计模式原理详细介绍,并且实现一个Future程序Java8实战视频-31JDK自带Future,Callable,ExecutorService介绍Java8实战视频-32实现一个异步基于事件回调的Future程序.wmvJava8实战视频-33CompletableFuture用法入门介绍Java8实战视频-34CompletableFuture之supplyAsync详细介绍Java8实战视频-35CompletableFuture流水线工作,join多个异步任务详细讲解Java8实战视频-36CompletableFuture常用API的重点详解-上Java8实战视频-37CompletableFuture常用API的重点详解-下Java8实战视频-38JDK老DateAPI存在的问题,新的DateAPI之LocalDate用法及其介绍.wmvJava8实战视频-39New Date API之LocalTime,LocalDateTime,Instant,Duration,Period详细介绍Java8实战视频-40New Date API之format和parse介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值