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

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

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

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

Java中的堆空间是什么?

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

如何增加Java堆空间

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为 -Xms=3670K 和 -Xmx=64M。对于64位操作系统,一般堆空间大小增加约30%。但你使用Java 1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK 1.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中垃圾回收的工作原理”来获得更多关于堆和垃圾回收的信息。

2789752.html

Java堆中的OutOfMemoryError错误

当JVM启动时,使用了-Xms 参数设置的对内存。当程序继续进行,创建更多对象,JVM开始扩大堆内存以容纳更多对象。JVM也会使用垃圾回收器来回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,JVM就会抛出java.lang.outofmemoryerror,你的程序就会当掉。在抛出 OutOfMemoryError之前,JVM会尝试着用垃圾回收器来释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误。为了解决这个问题,你需要清楚你的程序对象的信息,例如,你创建了哪些对象,哪些对象占用了多少空间等等。你可以使用profiler或者堆分析器来处理 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)的十个要点:

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

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

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

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

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

6. 你可以使用命令“jmap”来获得heap dump,用“jhat”来分析heap dump。

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

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

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

10. 请使用Profiler和Heap dump分析工具来查看Java堆空间,可以查看给每个对象分配了多少内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Struts2请求处理的内部流程图/结构图/原理图(版本一)

流程说明: 1.客户端浏览器(Client)向服务器发送一个 http 请求(HttpServletRequest) 2.Container(容器) 通过 web.xml 映射请求,并获得控制器(Controller)的…

python求字符串的所有子集_打印一字符串的所有子集 | 学步园

#include#include#include#includeusing namespace std;void getSub(string src,int i,vector &result){//取子串方法:将串src中的第i个字符抠掉即为所求的子串assert(iif (src.length()<1){result.push_back(src);return;}src.erase(i,1); //删除从i开始的一个字符r…

aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈

aws 堆栈模板在AWS云堆栈 &#xff08;例如DynamoDB&#xff0c;S3等&#xff09;上构建应用程序时&#xff0c;需要针对这些组件编写测试。 您可能首先想到的是拥有一个用于生产的环境和另一个用于测试的环境&#xff0c;然后针对该环境运行测试。 这对于集成测试&#xff0c…

java中springdi_java中spring入门

1、spring的概念apache推出的java企业框架&#xff0c;提供了基于ioc的对象工厂、aop面向切面编程等功能及其他增强功能。当前版本4.xxx&#xff0c;支持注解的配置。 springmvc。2、控制反转(ioc):inversion of control。用来描述框架的重要特征spring针对ioc的具体实现&#…

分析 Web 资源的访问过程(Servlet 程序访问过程)

浏览器输入地址&#xff1a;http://224.45.10.567:8080/qpw/greeting?namezs 浏览器通过224.45.10.567:8080与服务器&#xff08;Web Server&#xff0c;例如&#xff1a;Tomcat&#xff09;连接 服务器会在webapps目录下寻找qpw目录&#xff0c;找到后再进入qpw目录内寻找WE…

spring flux_Spring Web-Flux – Cassandra后端的功能样式

spring flux在上一篇文章中&#xff0c;我介绍了Spring Web-Flux的基础知识&#xff0c;它表示Spring框架的Web层中的响应式支持。 我已经展示了使用Spring Data Cassandra并在Spring Web Layers中使用传统注释支持的端到端示例&#xff0c; 大致如下&#xff1a; ... import…

tableau选择计算_干货 | 年薪40W, 掌握Tableau的留学生真的赚翻了

文章来源&#xff1a;UniCareer Tableau作为一款数据分析工具向来被视为文科转行Data必学因为它不需要你有Coding经验而且极易上手那么&#xff0c;Tableau究竟该怎么学&#xff1f;学会Tableau可以胜任哪些岗位&#xff1f;1Tableau: 学到就是赚到Tableau作为一款数据可视化工…

java 对线程进行事务控制_Java 多线程事务回滚 ——多线程插入数据库时事务控制...

背景日常项目中&#xff0c;经常会出现一个场景&#xff0c;同时批量插入数据库数据&#xff0c;由于逻辑复杂或者其它原因&#xff0c;我们无法使用sql进行批量插入。串行效率低&#xff0c;耗时长&#xff0c;为了提高效率&#xff0c;这个时候我们首先想到多线程并发插入&am…

Java Servlet 编程,重定向介绍

文章目录什么是重定向重定向流程演示图如何重定向注意的问题重定向的特点重定向演示什么是重定向 服务器向浏览器发送一个状态码 302 及一个消息头 location&#xff0c;浏览器收到后&#xff0c;会立即向 location 所指向的地址发送请求。 重定向流程演示图 &#xff08;1&a…

java platform_Java Platform Module系统中的可选依赖项

java platformJava平台模块系统&#xff08;JPMS&#xff09;对依赖项有很强的见解&#xff1a;默认情况下&#xff0c;需要它们&#xff08;可以访问&#xff09;&#xff0c;然后在编译时和运行时都将它们存在。 但是&#xff0c;这不适用于可选的依赖项&#xff0c;因为代码…

python图片重命名 工具_python - 请问django如何给上传的图片重命名

问 题我的models.py:pic models.ImageField(upload_toimg/%Y/%m)怎样给上传的图片重命名&#xff1f;例如&#xff1a;以当前上传的时间给图片命名.谢谢~&#xff01;解决方案结贴&#xff1a;1、先在你项目中添加一个文件夹如&#xff1a;system 在文件夹下添加__init__.py 和…

java索引序列_视图、序列、索引

视图视图(VIEW)也被称作虚表&#xff0c;即虚拟的表&#xff0c;是一组数据的逻辑表示。视图对应于一个SELECT语句&#xff0c;结果集被賦予一个名字&#xff0c;即视图名字。视图本身并不包含任何数据&#xff0c;它只包含映射到基表的一个查询语句&#xff0c;当基表数据发生…

Java 打 jar 包时,MANIFEST.MF 文件详解

具体详情&#xff0c;详见《MANIFEST.MF文件详解》 manifest.mf 的编写规则 不能有空行和空格的地方 第一行不可以是空行&#xff08;第一行的行前不可以有空行&#xff09;&#xff0c;行与行之间不能有空行&#xff0c;每行的行尾不可以有空格 一定要有空行的地方 最后一行…

hibernate删除记录_Hibernate记录:常见问题的提示和解决方案

hibernate删除记录如何通过适当的日志记录解决一些最常见的Hibernate问题&#xff1f; Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题&#xff0c;而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 …

python中的range_python中range()与xrange()用法分析

本文实例讲述了python中range()与xrange()用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;据说range比xrange开销要大&#xff0c;原因是range会直接生成一个list对象&#xff0c;而xrange每次调用返回其中的一个值(参考://www.jb51.net/article/50072.htm)。于是…

java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言&#xff1f;在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是&#xff0c;JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完…

Java 相关命令详解

文章目录jps常用选项javac标准选项联编选项非标准选项jarjavajavadoc常用选项javah常用选项javap常用选项jconsolejstatjstackjmapjavaw其它jps jps(Java Virtual Machine Process Status Tool) 是 JDK 1.5 提供的一个显示当前所有 java 进程 pid 的命令&#xff0c;简单实用&…

pc端游戏修改器_原神:不要吐槽手机内存了,想要获得最佳游戏体验,PC端最合适...

想必大家这段时间都被一个米哈游公司的游戏给刷屏了吧&#xff0c;它就是号称用时三年&#xff0c;斥资一亿美元打造的《原神》&#xff0c;正是这种情况下&#xff0c;原神的关注远远要高于其他游戏&#xff0c;并且玩家的期望值也是和关注度成正比。但是&#xff0c;一经发布…

java调用命令行命令_Java命令行界面(第4部分):命令行

java调用命令行命令我的Java命令行解析系列的第四部分介绍了Commandline &#xff0c;它被描述为 “用于解析命令行参数的Java库”&#xff0c;它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样&#xff0c; Commandline使用注释来提供潜在命令行…

java 字段为空设置默认值_java – 当字段为空时使用MyBatis添加默认值

当我的字段为空时,我想从数据库中插入默认值.我使用的是Oracle数据库.CREATE TABLE "EMPLOYEE"("COL1" VARCHAR2(800) NOT NULL ENABLE,"COL2" VARCHAR2(100) DEFAULT NOT NULL toto,CONSTRAINT "PK_EMPLOYEE" PRIMARY KEY ("COL…