从 Full GC 信息可知,新生代可用的内存大小约为 18M,则新生代实际分配得到的内存空间约为 20M(为什么是 20M? 请继续看下面...)。老年代分得的内存大小约为 42M,堆的可用内存的大小约为 60M。可以计算出: 18432K ( 新生代可用空间 ) + 42112K ( 老年代空间 ) = 60544K ( 堆的可用空间 )
新生代约占堆大小的 1/3,老年代约占堆大小的 2/3。

java执行时jvm参数设定:-Xms60m 3 -Xmx60m 4 -Xmn20m 5 -XX:NewRatio=2。

按上面代码中注释的信息设定 jvm 相关的参数项,并执行程序,下面是一次执行完成控制台打印的结果:

[ GC [ PSYoungGen:  1351K -> 288K (18432K) ]  1351K -> 288K (59392K)

打印结果可以看出,堆中新生代的内存空间为 18432K ( 约 18M ),eden 的内存空间为 16384K ( 约 16M),from / to survivor 的内存空间为 2048K ( 约 2M)。
这里所配置的 Xmn 为 20M,也就是指定了新生代的内存空间为 20M,可是从打印的堆信息来看,新生代怎么就只有 18M 呢? 另外的 2M 哪里去了? 别急,是这样的。新生代 = eden + from + to = 16 + 2 + 2 = 20M,可见新生代的内存空间确实是按 Xmn 参数分配得到的。而且这里指定了 SurvivorRatio = 8,因此,eden = 8/10 的新生代空间 = 8/10 * 20 = 16M。from = to = 1/10 的新生代空间 = 1/10 * 20
= 2M。
堆信息中新生代的 total 18432K 是这样来的: eden + 1 个 survivor = 16384K + 2048K = 18432K,即约为 18M。
因为 jvm 每次只是用新生代中的 eden 和 一个 survivor,因此新生代实际的可用内存空间大小为所指定的 90%。
因此可以知道,这里新生代的内存空间指的是新生代可用的总的内存空间,而不是指整个新生代的空间大小。

最后,这里还指定了 PermSize = 30m,PermGen 即永久代 ( 方法区 ),它还有一个名字,叫非堆,主要用来存储由 jvm 加载的类文件信息、常量、静态变量等。

本文转自:http://www.th7.cn/Program/java/201409/276272.shtml

最新文章

  1. 如何在Web引用中使用项目自定义的类
  2. button 按钮,结合onclick事件,验证和提交表单
  3. 软件工程(C编码实践篇)课程总结
  4. elk系列1之入门安装与基本操作
  5. ubuntu apc 安装
  6. [复变函数]第11堂课 3.3 Cauchy 积分定理及其推论
  7. J2SE知识点摘记-数据库(一)
  8. VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)
  9. 一步步学习EF Core(2.事务与日志)
  10. MySQL索引语法+使用场景
  11. MySQL创建一个固定频率执行且自定义"开始"时间的定时任务event
  12. SQL基础-----DDL
  13. [AI开发]基于深度学习的视频多目标跟踪实现
  14. Cocos Creator 生命周期回调(官方文档摘录)
  15. 增加 jQueryValidate的手机号验证功能
  16. Android UiAutomator 快速调试
  17. hihocoder #1828 : Saving Tang Monk II(BFS)
  18. JavaScript之判断参数的数值的详细类型
  19. Eval与DataBinder.Eval的区别
  20. 20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践

热门文章

  1. 1.3(Mybatis学习笔记)动态SQL
  2. Linux批量管理工具Ansible
  3. Jackson使用ObjectManage#readValue传入泛型T的问题
  4. Linux Hook 笔记
  5. 使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
  6. python抓取日本网站上iphone5的价格
  7. 第五章:关于ESearch的应用
  8. @CrossOrigin 跨域注解
  9. SpringBoot Tips
  10. lua面向对象编程 《lua程序设计》 16章 笔记