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区域 一般来说,新创建的对象都会直 ...
随机推荐
- applicationContext-redis.xml
一.动态切换单机和集群 spring-redis 的配置 <!-- 连接redis单机版 --> <bean id="jedisClientPool" class ...
- 前端框架Bootstrap简单介绍
下载: 解压之后: 把这些文件拷贝到项目中 页面使用时 只需要引入: 然后我们就可以参考官网来设计需要的前端页面了 设计一个按钮:button 只需要标明css样式中使用的类 下面就是现实效果:
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第五篇【AppiumLibrary校验函数介绍】
http://blog.csdn.net/deadgrape/article/details/50619050 以上连作者先跪一下方便面,在上一篇中,作者遗漏了两个常用的函数: 1.长按 Long P ...
- Java 学习(9):java Stream & File & IO
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
- asp.net-EF事物与存储过程
FK_Equipment_EquipmentClass 这个是sql中的命名规范,外键名称在前面,主键名称在后面 EF事务的代码 DbTransaction tran = null; try { ne ...
- Vijos—— T 1359 Superprime
https://vijos.org/p/1359 描述 农民约翰的母牛总是生产出最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因 ...
- Python Study (01) 之 特殊方法
Python深入:特殊方法和多范式 Python是一切皆对象,意思就是python的天生就是个"纯面向对象语言"呀. 但是!!! Python还是一个多范式语言(multi-par ...
- [BZOJ 3884][欧拉定理]上帝与集合的正确使用方法
看看我们机房某畸形写的题解:http://blog.csdn.net/sinat_27410769/article/details/46754209 此题为popoQQQ神犇所出,在此orz #inc ...
- leetcode dfs Palindrome Partitioning
Palindrome Partitioning Total Accepted: 21056 Total Submissions: 81036My Submissions Given a string ...
- 浅析Context Class Loader
浅析Context Class Loader 2010-05-11 16:58:49 分类: Java 转载自 薛笛的专栏http://blog.csdn.net/kabini/archive/200 ...