jvm的见解

阅读了下面两篇博文后记录一下阅读心得。其中第一篇整体讲解了java的虚拟机运行机制,第二篇只讲解了一下虚拟机的heap即堆栈区域的管理。
http://blog.chinaunix.net/uid-9789791-id-3350463.html
http://www.cnblogs.com/zcshan/archive/2011/03/10/jvm.html

首先jvm是java字节码运行的平台,这个平台可以解析字节码,然后把解析后的命令发给系统执行。所以java可以做到一次编译,各平台运行就是这种原因。
想要认识java内存管理策略,首先要理解堆和栈,这是java主要的内存区域,这是网上比较粗略的一个分法,其实jvm内存分区很复杂。一般认为堆即是heap是用来保存对象的,这个区域是线程共享的,而栈是用来保存操作栈和局部变量的。另外还有一个方法区,有些人把方法区归为栈,但应该不太确切。第一篇博文就提到两者的很多差别。我认为堆其实就是整个程序的公共区域,而栈就是一个线程执行时记录执行情况和数据的区域。一个对象未被线程使用时就会放在堆里,一旦线程进入对象的方法了,那它的局部变量就会被读入栈中,方法会被读入方法区,同时栈会记录执行情况(即操作栈)。堆是内存的主要区域,所以要更好地管理Java内存就要理解好堆的管理。

第二篇博文就是介绍堆的管理的,堆分为三个区域,一个是young,一个是old,一个是Permanent。第一个是保存刚建立的对象的,第二个是保存因久未使用而从young区域转出来的对象的,而第三个是保存反射对象的。这样就很好理解了,当内存清理线程在old无法清理空间而程序又需要新建对象时就会发生outofmemory的异常。所以平时编码时要注意减少建立对象,比如用stringbuilder拼字符串。

java的内存是自动管理的,我们可以通过执行System.gc()或Runtime.gc()促进垃圾收集,但不能完全控制。我们可以通过该配置来确定jvm内存收集的机制,jvm用两gc管理old区和young区,一个区一个gc。而gc有四种机制,第一种是单线程的;第二种是多线程的但是收集old区仍和第一种一样;第三种类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间,这种GC可以在Old区的回收同时,运行应用程序;第四种缩短因GC造成程序停滞的时间,可以在Young区回收的同时,回收一部分Old区对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值