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. (3)Spring Boot热部署【从零开始学Spring Boot】

    在编写代码的时候,你会发现我们只是简单把打印信息改变了下,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来之后就真的是打几个Hello World之后就下班了.那么如何解决热部署的问题呢?那 ...

  2. BA-Bacnet ip 、TCP/IP

    BACENT IP TCP/IP协议

  3. HDU 4454

    想了很久,发现其实就只需要三分枚举圆上的点,到矩形的最短很容易就可以求到了.开始时考虑要不要根据矩形相对圆的方位来划分枚举区间,后来发现一定不能这样做的. 注意题目给的是矩形的对角形,但没说哪一条对角 ...

  4. HDU 1171 Big Event in HDU(多重背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  5. STL之效率比較

    1.vector 变长一维数组,连续存放的内存块,有保留内存.堆中分配内存: 支持[]操作,高效率的随机訪问: 在最后添加元素时,一般不须要分配内存空间,速度快:在中间或開始操作元素时要进行内存拷贝效 ...

  6. Redis源代码分析(二十二)--- networking网络协议传输

    上次我仅仅分析了Redis网络部分的代码一部分,今天我把networking的代码实现部分也学习了一遍,netWorking的代码很多其它偏重的是Clientclient的操作.里面addReply( ...

  7. springmvc+spring+jpa(hibernate)+redis+maven配置

    废话不多少 项目结构 pom.xml配置例如以下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...

  8. angularjs1-过滤器

    <!DOCTYPE html> <html> <body> <header> <meta http-equiv="Content-Typ ...

  9. Linux下配置httpd服务

    第一步拷贝 cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd 第二步,修改 vim /etc/rc.d/init.d/httpd # ...

  10. 38.Qt模型/视图结构

    1.模型/视图类 2.模型 3.视图 4.代理 1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringL ...