堆空间是Java进程的重要组成部分,几乎所有的应用相关的内存空间都和堆有关。

1.最大堆和初始堆的设置

当Java程序启动时,虚拟机就会分配一块初始堆空间,使用参数 -Xms 指定这块空间的大小。一般来说,虚拟机尽可能维持初始堆空间的范围内运行。如果初始堆空间耗尽会进行扩展。最大堆空间使用参数 -Xmx指定。

在实际工作中,可以直接将初始堆 -Xms 与最大堆 -Xmx 设置相等。这样的好处是可以减少程序运行时进行的垃圾回收次数,从而提高程序的性能。

新生代的配置

   参数 -Xmn 可以用于设置新生代的大小。设置一个较大的新生代会减小老年代的大小,这个参数对系统性能以及GC行为影响较大。新生代的大小一般设置为整个堆空间的1/3到1/4。

   参数 -XX:SurvivorRatio 用来设置新生代中 eden空间和from/to空间的比例关系,含义如下:

   --X:SurvivorRatio=eden/from=eden/to

   这段代码连续向系统请求10MB空间,每次申请1MB

[GC (Allocation Failure) [PSYoungGen: 512K->488K(1024K)] 512K->512K(19968K), 0.0008869 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
PSYoungGen total 1024K, used 860K [0x00000000ffe80000, 0x0000000100000000, 0x0000000100000000)
eden space 512K, % used [0x00000000ffe80000,0x00000000ffedd2f8,0x00000000fff00000)
from space 512K, % used [0x00000000fff00000,0x00000000fff7a020,0x00000000fff80000)
to space 512K, % used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
ParOldGen total 18944K, used 10264K [0x00000000fec00000, 0x00000000ffe80000, 0x00000000ffe80000)
object space 18944K, % used [0x00000000fec00000,0x00000000ff6060a0,0x00000000ffe80000)
Metaspace used 2666K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 286K, capacity 386K, committed 512K, reserved 1048576K
Java HotSpot(TM) 64-Bit Server VM warning: NewSize (1536k) is greater than the MaxNewSize (1024k). A new max generation size of 1536k will be used.

这里eden与from的比值为2比1,故eden区为512kb。这里使用的jdk1.8最后提示:NewSize (1536k) is greater than the MaxNewSize (1024k). A new max generation size of 1536k will be used.

超过了设定的1M

由于eden区无法容纳任何一个程序分配的1MB数组,故触发了一次新生代GC,对eden区进行了部分回收,同时,这个偏小的新生代无法为1MB数组预留空间,所以所有的都分配在老年代,老年代最终占用10264KB空间。

在实际工作中,应该根据系统的特点做合理的设置,基本策略是:尽可能将对象预留在新生代,减少老年代GC的次数。

除了可以使用-Xmn指定新生代的绝对大小外,还可以使用 -XX:NewRatio 来设置新生代和老年代的比例。  -XX:NewRatio=老年代 / 新生代

Java虚拟机五 堆的参数配置的更多相关文章

  1. 了解java虚拟机—非堆相关参数设置(4)

    非堆内存相关配置 -XX:PermSize 永久区初始大小 -XX:MaxPermSize 永久区最大大小 在JDK1.8中使用-XX:MxMetaspaceSize配置永久区最大大小 -Xss 线程 ...

  2. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  3. 如何设置Java虚拟机JVM启动内存参数

    Tomcat默认的Java虚拟机JVM启动内存参数大约只有64MB或者128MB,非常小,远远没有利用现在服务器的强大内存,所以要设置Java虚拟机JVM启动内存参数.具体设置方法为: Tomcat修 ...

  4. Java虚拟机详解----常用JVM配置参数

    本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多 ...

  5. 【转】Java虚拟机详解----常用JVM配置参数

    原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html 本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: ...

  6. 【java虚拟机】常用的jvm配置参数

    转自:https://www.cnblogs.com/pony1223/p/8661219.html 零.在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技 ...

  7. Java虚拟机六 堆溢出的处理

    在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM. Exception in thread "main" java.lang.Out ...

  8. 2019/05/11 JAVA虚拟机原理堆、栈、方法区概念区别

    Java堆 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对 ...

  9. java虚拟机的堆内存配置

    官网文档地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 接录如下: -XX:MaxHeapSize=si ...

随机推荐

  1. 未定义变量 "caffe" 或类 "caffe.reset_all"

    配置caffe后在matlab中测试报错. 未定义变量 "caffe" 或类 "caffe.reset_all". 我的原因是:caffe在matlab接口处没 ...

  2. 使用jstl+el表达式遇到的几个问题

    1.使用jstl访问Map<Integer,String>中的内容时总取不到? el表达式的一个bug,在解析数字的时候,会自动将数字转换成Long类型. 我的解决办法是,Map的key改 ...

  3. python中,如何将多行进行输出,同时将行尾的换行符去掉

    需求说明: 比如我要输出字符串的常量,字符串常量要输出多行,该怎么解决呢 操作过程: 1.可以通过三引号(""" .... """)将要输出 ...

  4. js中判断浏览器版本

    var ai = { ovb: { /** * 该对象用于判断系统,系统版本,浏览器,苹果设备等等功能.ovb是单词 Os Version Browser 的头字母缩写. */ _version_va ...

  5. mongodb 初学 索引

    连接服务器异常(Connection refused) 啦啦啦 mongodb 搭建主从服务器 啦啦啦 Mongodb启动命令mongod参数说明 啦啦啦 MongoDB 分片 啦啦啦 啦啦啦 啦啦啦 ...

  6. ArcGIS应用

    1.ArcGIS Server发布资源报错:网络资源问题 有可能是跟网络相关的服务没有开启,开启相关服务器后有可能可以解决此问题. 还有可能通过此法解决:开始--控制面板--网络和共享中心--高级共享 ...

  7. 我的WAF Bypass实战系列

    ​ 梳理了一下自己写过的WAF Bypass相关的文章,按照编写时间顺序,整理成了一个WAF Bypass实战系列,如果你准备了解WAF攻防这一块的内容,可以来了解一下. 第一篇:<Bypass ...

  8. session会话保持

    #coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ...

  9. 嵌入式系统之ubootENV环境变量

    从bootm 命令讲起 1 找到linux的内核入口 Bootm命令通过读取uImage的头部0×40字节的信息,将uImage定位到正确的地址,同时找到linux的内核入口地址. 这个地方就涉及到u ...

  10. c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...