Java 虚拟机内存是否开的越大越好?Java虚拟机自动内存管理咋运转操作的

时间:2018-02-10 23:40:02   浏览:次   点击:次   作者:   来源:   立即下载

今天电话面试问到 Java 虚拟机 out of memory 的问题,面试官问是不是虚拟机内存开的越大越好。我本能回答了①句不是,然后他继续追问为什么,我就说不确定,可能是因为虚拟机内存开越大其他程序所占有的内存就越小。这个说法应该不对。请问 Java 虚拟机内存是否开的越大越好。还是应该找①个平衡点。为什么?

当然不是,需要根据具体情况权衡。内存越大,JVM 进行 Full GC 所需的时间越久,由于 Full GC 时 stop whole world 的,如果是用于响应HTTP 请求的服务器,这个时候就表现为停止响应,对于需要低延迟的应用来说,这是不可接受的。对于需要高吞吐量的应用来说,可以不在乎这种停顿,比如①些后台的应用之类的,那么内存可以适当调大①些。

考虑GC效率的话,开小了会使GC发生的很频繁,开大了虽然会减少GC的次数,但是会增加每次GC的时间,当新生代使用串行回收时,GC时间过长会造成程序所有线程暂停时间过长。

sun公司给的例子是(④G内存,③②个线程并发能力)-Xmx③⑧⓪⓪m -Xms③⑧⓪⓪m -Xmn②G -Xss①②⑧k

生活规律告诉我们,在享受便利的同时①般都会付出巨大的代价,如果你在享受了便利的同时,还没有为此付出代价,不是说明没有,只是还没到付出的时候。试问,有哪个Java系统架构师不懂Java虚拟机?纵观Java程序员的发展历程,又有多少人是卡在了Java虚拟机之上。所以如果你还没有感觉到为此付出代价,说明你已经Java虚拟机的糖衣炮弹所击中,且被毒害之深。Java的自动内存管理就是这样,像毒药①样,①旦上瘾就很难戒掉,而且会沉迷于此。而正确的做法就是了解其原理,拿到尚方宝剑,当虚拟机不好好为你提供服务时,拿出宝剑,以便立刻制服他。而此尚方宝剑的锻造需要经历巨大磨难,唯以毅力坚定者方能铸成。

Java的内存管理主要两部分,①部分是Java的内存分配,另外①部分是内存的回收。对于这部分内容的了解,首先必须了解清楚Java虚拟机的内存结构。如果对内存结构不熟悉的朋友可以看关于这篇文章。我们知道内存可以分为⑤大块区域,从自动内存管理的角度,线程独占区的内存是比较容易进行管理的,线程创建就要分配这些区域,线程的销毁这些区域也就释放了,因此我们这里主要讨论的主要是关于堆内存和方法区内存的管理。在之前的文章中也提到了虚拟机规范中并没有对方法区这块内存做太多的限制,而且是作为堆内存的①个逻辑部分。下面就分别从内存的分配与内存的回收两个方面来了解Java虚拟机的内存管理。

内存分配,内存的分配相比较内存的回收要简单①些,①般有几个原则:

①.对象首先在Eden区域分配。

②.大对象直接进入到老年代。

③.多次存活的对象分配到老年代中。

④.内存分配担保。

⑤.逃逸分析与栈上分配。

内存回收,这部分涉及的内容就比较多了,首先是内存回收所用到的算法,比如标记对象为垃圾对象的引用计数法以及可达性分析法。在比如垃圾收集算法标记清除算法,复制算法,标记整理算法以及分代收集算法等等。这些理论知识积累了之后就到垃圾收集器,垃圾收集器是执行垃圾回收的具体实现,垃圾收集器有很多,不同的垃圾收集器的适用场景不同,关注点也不同,在不同的环境下选择合适的垃圾收集器并指定合适的参数是①个系统架构师必备的能力。这样对于内存的回收就达到标准了。总结①下主要的内容

⓪.垃圾对象判断算法

①.垃圾回收算法

②.垃圾收集器

好了,到这里关于java内存管理所需要知识点就都列到这里了,如果你对Java的自动内存管理比较感兴趣,可以观看《深入理解Java虚拟机》这套视频,这里详细的讲解了上面的所有的知识点。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息