jvm 虚拟机参数_堆内存分配
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 虚拟机参数_堆内存分配的更多相关文章
- jvm 虚拟机参数_新生代内存分配
1.参数 -Xmn 设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及 GC 行为影响很大,新生代大小一般设置为真个堆内存的1/3到1/4 -XX:SurvivorRa ...
- jvm 虚拟机参数_栈内存分配
1.参数 -Xss 指定线程最大的栈空间,整个参数也直接决定了函数可调用的最大深度 2.测试代码 private static int count; public static void addCou ...
- JVM系列(1)- JVM常见参数及堆内存分配
常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...
- jvm 虚拟机参数_方法区内存分配
1.方法区( 永久区 ) 和堆一样,方法区是一块所有线程共享的区域,他用于保存系统类的信息.默认情况下 -XX:MaxPermSize 为 64m.如果系统运行时产生大量的类,就需要设置一个合适方法区 ...
- JVM虚拟机-了解Java堆中对象分配、布局和访问的全过程
目录 前言 对象的创建 类加载检查 分配内存 内存空间分配方式 指针碰撞 空闲列表 并发时的内存分配 同步处理:CAS 本地线程分配缓冲:TLAB 初始化零值 设置对象头 执行 init 方法 对象的 ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
- Java虚拟机05.2(内存分配)
jdk1.7中堆内存分为:年轻代+老年代+永久代.但是永久代有作为非堆内存存在,也就是说堆内存的大小应该为年轻代+老年代.在tomcat容器中,如果jsp页面过多可能出现永久代溢出.通常栈溢出都是程序 ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- 深入了解java虚拟机(JVM) 第七章 内存分配策略
理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域 一般来说,新创建的对象都会直 ...
随机推荐
- 【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 定义dis[i][j]表示到达i这个点. 用掉了j次去除边的机会的最短路. dis[1][0]= 0; 在写松弛条件的时候. 如果用 ...
- NYIST 1083 美丽的校园
美丽的校园时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 美丽的校园需要大家维护,作为南工学子,当然有责任! 在计科系门前有n棵树,按一行排列在计科系楼前面,它们在一条直线上, ...
- 机房-动环-江森ODS系统
优势: 标准的BACnet系统平台 开放的集成特性 支持Desktop and Server平台 支持多达100个NxE 支持无线应用,可以手机访问 DCIM---数据中心基础架构管理平台介绍 不同于 ...
- Android图文混排-实现EditText图文混合插入上传
前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中.须要支持文本和图片的混合插入,下图演示输入的演示样例: 当会议 ...
- linux删除多行
光标放到行dd:删除所在行 光标放到行Ndd: 删除所在行下的N行
- 宝马男砍人不慎刀落反被杀 防卫过当or故意伤害(在生命受到威胁的情况下,已经很难判断对方意图了,而且假如于莫是老弱妇幼,可能现在死的就是于莫了)
如果被砍的是周律师他就不会说是防为过当吧,宝马车主跑回自己的车边时最危险,不知道他车上还有什么刀枪之类的.这如果判防卫过当,恶人会更恶,老实人连防卫都不敢了. 不知道在这个没有法治的国家会是如何判案的 ...
- php如何判断两个时间戳是一天
$date1 = getdate(strtotime('2013-12-31')); $date11 = getdate(strtotime('2014-01-01')); $date2 = getd ...
- jQuery插件开发的两种方法
1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...
- SQL 导出数据字典
用于参考: SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case w ...
- Spark SQL概念学习系列之性能调优
不多说,直接上干货! 性能调优 Caching Data In Memory Spark SQL可以通过调用sqlContext.cacheTable("tableName") 或 ...