1、参数

-XX:+PrintGC    只要遇到 GC 就会打印日志
-XX:+UseSerialGC 配置串行回收器
-XX:+PrintGCDetails 查看详细信息,包括各个区的情况
-XX:+PrintCommandLineFlags 可以将隐式或显式传给虚拟机的参数输出
-Xms4m 设置堆初始大小为 4m
-Xmx20m 设置堆最大为 20m

2、备注

以 -XX:+PrintGC 为例子
1、-XX 表示对系统级别的 ( jvm ) 配置,比如日志信息、使用什么样的垃圾回收器
2、非 -XX 基本上都是对应用层面上的配置,比如内存、方法区、栈的大小等等( 例子 -Xms4m 设置堆的初始大小为 4m )
3、PrintGC 前面的 "+" 表示启用,如果是 "-" 则表示禁用  

3、测试代码

public static void main(String[] args)
{
//-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
//查看 GC 信息
System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大内存
System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空闲内存
System.out.println("total memory" + Runtime.getRuntime().totalMemory());//总共使用的内存
System.out.println("=========================================================="); byte[] b1 = new byte[1*1024*1024];
System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大内存
System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空闲内存
System.out.println("total memory" + Runtime.getRuntime().totalMemory());//总共使用的内存 System.out.println("==========================================================");
byte[] b2 = new byte[4*1024*1024];
System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大内存
System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空闲内存
System.out.println("total memory" + Runtime.getRuntime().totalMemory());//总共使用的内存
}

4、eclipse 配置 jvm 参数

右键 --> Run As --> Run Configurations 。在 VM arguments 中输入 -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

( 进入 Run Configurations 界面后,Java Application 没有对应的选项,你需要先 右键 --> Run As --> Java Application )

5、控制台打印结果

 -XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC
max memory20316160
free memory4449752
total memory5111808
==========================================================
[GC [DefNew: 646K->128K(1536K), 0.0022938 secs] 646K->470K(4992K), 0.0023261 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
max memory20316160
free memory3552072
total memory5111808
==========================================================
[GC [DefNew: 1180K->0K(1536K), 0.0027321 secs][Tenured: 1494K->1494K(3456K), 0.0023825 secs] 1523K->1494K(4992K), [Perm : 2544K->2544K(21248K)], 0.0051517 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
max memory20316160
free memory3636792
total memory9441280
Heap
def new generation total 1664K, used 108K [0x00000000f9a00000, 0x00000000f9bc0000, 0x00000000fa0a0000)
eden space 1536K, 7% used [0x00000000f9a00000, 0x00000000f9a1b148, 0x00000000f9b80000)
from space 128K, 0% used [0x00000000f9b80000, 0x00000000f9b80000, 0x00000000f9ba0000)
to space 128K, 0% used [0x00000000f9ba0000, 0x00000000f9ba0000, 0x00000000f9bc0000)
tenured generation total 7556K, used 5590K [0x00000000fa0a0000, 0x00000000fa801000, 0x00000000fae00000)
the space 7556K, 73% used [0x00000000fa0a0000, 0x00000000fa615bc8, 0x00000000fa615c00, 0x00000000fa801000)
compacting perm gen total 21248K, used 2554K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb07eba0, 0x00000000fb07ec00, 0x00000000fc2c0000)
No shared spaces configured.

6、分析打印结果

01、第 01 行:之所以会有第一行的打印,是因为 +PrintCommandLineFlags 这个参数
02、第 02 行:最大内存 20316160
03、第 03 行:空闲内存 4449752
04、第 04 行:使用内存 5111808
05、==================
06、第 06 行:DefNew 新生区经过 gc 后内存情况,[DefNew: 646K->128K(1536K), 0.0022938 secs] 新生区内存使用由 646K 变为 128K ,耗时 0.0022938 secs。[Times: user=0.00 sys=0.00, real=0.00 secs] 执行时间 用户的、系统的、走完这段代码实际耗时的
07、第 07 行:最大内存 20316160
08、第 08 行:空闲内存 3552072
09、第 09 行:使用内存 5111808
10、==================
11、第 11 行:[DefNew: 1180K->0K(1536K), 0.0027321 secs] 新生区内存使用由 1180K 变为 0k,[Tenured: 1494K->1494K(3456K), 0.0023825 secs] 老年区内存使用由 1494K 变为 1494K,[Perm : 2544K->2544K(21248K)], 0.0051517 secs] 永久区内存使用由 2544K 变为 2544K,[Times: user=0.02 sys=0.00, real=0.00 secs] 耗时情况
12、第 12 行:最大内存 20316160
13、第 13 行:空闲内存 3636792
14、第 14 行:使用内存 9441280 ( 当使用内存高于最小内存时,就会向最大内存借,借多少用多少,9441280 = 4m + 5111808 )
15、第 15 行:Heap 堆使用明细 ( 之所以会打印明细是因为 -XX:+PrintGCDetails 这个参数 )
16、第 16 行:def new generation total 1664K, used 108K,新生区 总共 1664k ,使用了 108k
17、第 17 行:eden space 1536K, 7% used,eden( 伊甸园区 ) 总共 1536k,使用了 7%
18、第 18 行:from space 128K, 0% used,from( s0 区 ) 总共 128k,使用了 0%
19、第 19 行:to space 128K, 0% used,to( s1 区 ) 总共 128k,使用了 0%
20、第 20 行:tenured generation total 7556K, used 5590K,老年区 总共 7556k 使用了 5590k
21、第 21 行:the space 7556K, 73% used,总共 7556k 使用了 73%
22、第 22 行:compacting perm gen total 21248K, used 2554K,方法区( 永久区 ) 总共 21248k 使用了 2554k
23、第 23 行:the space 21248K, 12% used,总共 21248k 使用了 12%

7、总结

实际工作中,将初始化堆内存大小与最大堆内存大小设置相等,这样可以减少程序运行时垃圾回收次数,从而提高性能。(  个人建议调到 80%  )

jvm 虚拟机参数_堆内存分配的更多相关文章

  1. jvm 虚拟机参数_新生代内存分配

    1.参数 -Xmn 设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及 GC 行为影响很大,新生代大小一般设置为真个堆内存的1/3到1/4 -XX:SurvivorRa ...

  2. jvm 虚拟机参数_栈内存分配

    1.参数 -Xss 指定线程最大的栈空间,整个参数也直接决定了函数可调用的最大深度 2.测试代码 private static int count; public static void addCou ...

  3. JVM系列(1)- JVM常见参数及堆内存分配

    常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...

  4. jvm 虚拟机参数_方法区内存分配

    1.方法区( 永久区 ) 和堆一样,方法区是一块所有线程共享的区域,他用于保存系统类的信息.默认情况下 -XX:MaxPermSize 为 64m.如果系统运行时产生大量的类,就需要设置一个合适方法区 ...

  5. JVM虚拟机-了解Java堆中对象分配、布局和访问的全过程

    目录 前言 对象的创建 类加载检查 分配内存 内存空间分配方式 指针碰撞 空闲列表 并发时的内存分配 同步处理:CAS 本地线程分配缓冲:TLAB 初始化零值 设置对象头 执行 init 方法 对象的 ...

  6. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  7. Java虚拟机05.2(内存分配)

    jdk1.7中堆内存分为:年轻代+老年代+永久代.但是永久代有作为非堆内存存在,也就是说堆内存的大小应该为年轻代+老年代.在tomcat容器中,如果jsp页面过多可能出现永久代溢出.通常栈溢出都是程序 ...

  8. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  9. 深入了解java虚拟机(JVM) 第七章 内存分配策略

    理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直 ...

随机推荐

  1. 【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 定义dis[i][j]表示到达i这个点. 用掉了j次去除边的机会的最短路. dis[1][0]= 0; 在写松弛条件的时候. 如果用 ...

  2. NYIST 1083 美丽的校园

    美丽的校园时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 美丽的校园需要大家维护,作为南工学子,当然有责任! 在计科系门前有n棵树,按一行排列在计科系楼前面,它们在一条直线上, ...

  3. 机房-动环-江森ODS系统

    优势: 标准的BACnet系统平台 开放的集成特性 支持Desktop and Server平台 支持多达100个NxE 支持无线应用,可以手机访问 DCIM---数据中心基础架构管理平台介绍 不同于 ...

  4. Android图文混排-实现EditText图文混合插入上传

    前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中.须要支持文本和图片的混合插入,下图演示输入的演示样例: 当会议 ...

  5. linux删除多行

    光标放到行dd:删除所在行 光标放到行Ndd: 删除所在行下的N行

  6. 宝马男砍人不慎刀落反被杀 防卫过当or故意伤害(在生命受到威胁的情况下,已经很难判断对方意图了,而且假如于莫是老弱妇幼,可能现在死的就是于莫了)

    如果被砍的是周律师他就不会说是防为过当吧,宝马车主跑回自己的车边时最危险,不知道他车上还有什么刀枪之类的.这如果判防卫过当,恶人会更恶,老实人连防卫都不敢了. 不知道在这个没有法治的国家会是如何判案的 ...

  7. php如何判断两个时间戳是一天

    $date1 = getdate(strtotime('2013-12-31')); $date11 = getdate(strtotime('2014-01-01')); $date2 = getd ...

  8. jQuery插件开发的两种方法

    1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...

  9. SQL 导出数据字典

    用于参考: SELECT       表名=case   when   a.colorder=1   then   d.name   else   ''   end,     表说明=case   w ...

  10. Spark SQL概念学习系列之性能调优

    不多说,直接上干货! 性能调优 Caching Data In Memory Spark SQL可以通过调用sqlContext.cacheTable("tableName") 或 ...