JVM内存分配和垃圾回收以及性能调优
JVM内存分配策略
一:堆中优先分配Eden
大多数情况下,对象都在新生代的Eden区中分配内存。而新生代会频繁进行垃圾回收。
二:大对象直接进入老年代
需要大量连续空间的对象,如:长字符串、数组等,会直接在老年代分配内存。这是因为,这样可以避免在新生代区频繁的GC时发生大量的内存赋值(新生代的GC是采用复制算法的)。
三:长期存活的对象“晋入”老年代
新生代中经历了多次GC仍然存活的对象。为了识别哪些对象应该放在新生代、哪些对象应该放在老年代,JVM给每个对象定义了一个对象年龄计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,便可以被移动到Survivor空间中,年龄计数器将设置该对象的年龄为1.对于对象在Survivor区每经过一次Minor GC,年龄便增加1岁,当它的年龄增加到一定程度(可以调整参数-XX:MaxTenuringThreshold设置进入老年代的年龄),该对象便会进入到老年代中。
但是为了更好地适应内存情况,虚拟机不是要求对象必须到达阀值才可晋升老年代的,而是采用动态年龄判定的方法:如果Servivor空间中相同年龄的对象大小大于Servivor空间的一般时,由于下一次的MinorGC时,这些对象如果仍然存活的话,复制到ToServivor空间时就放不下了。所以,在本次GC时就可以把这些对象以及年龄大于等于这些对象的直接进入老年代。
在MinorGC时,如果Eden和FromServivor中存活的对象在复制到ToServivor时放不下了,也会直接分配到老年代。
四:对象优先分配在线程的本地分配缓冲区
在前面我们提到,每个线程可以在堆中预先分配得到一片区域,作为本地线程分配缓冲区(TLAB)。当该线程执行时,有对象创建的话,就在该线程的TLAB中分配内存。当该线程的TLAB用完了才申请堆中的空闲内存。
五:空间分配担保
在MinorGC之前,会先检查老年代最大可用空间是否可以容纳新生代所有对象(防止新生代全部晋升时放不下),如果可以容纳,则MinorGC可以安全执行。否则,检查是否允许担保失败,是则检查老年代最大可用空间是否大于历次晋升到老年代的对象的平均大小,是则尝试进行MinorGC;小于或者MinorGC失败,则会发起一次FullGC清理老年代。
垃圾回收
一:判定对象是否为垃圾对象
a.引用计数法
b.可达性分析法(重点)
二:回收算法
a.标记清除算法(效率不高,而且会出现不连续空间)
b.复制算法(浪费了部分空间)
c.标记整理算法(一般针对老年代)
d.分代收集算法(结合复制算法和标记整理算法)
三:垃圾收集器
Serial(单线程)
ParNew(多线程)
CMS(优点:并发收集,低停顿)
G1(优点:并行于并发,分代收集,空间整合,可预测停顿)
......
JVM性能调优
一:在调优之前的了解
1.多数的Java应用不需要在服务器上进行GC优化
2.多数导致GC问题的应用,不是因为参数设置的问题,而是代码问题
3.在应用上线之前,先考虑将机器的JVM参数设置到最优
4.在实际中,分析GC情况优化代码比优化JVM参数多的多
5.GC优化是最终手段
二:GC优化常用方案
1.将转移到老年代的对象的数量减少(如调整新生代的空间)
2.减少full GC的执行时间(如调整老年代的大小)
3.减少使用全局变量和大对象
4.选择合适的GC收集器
JVM常用参数设置
在Run Configurations中设置VM arguments
JVM内存分配和垃圾回收以及性能调优的更多相关文章
- JVM内存分配与垃圾回收机制管理
项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...
- 浅谈JVM内存分配与垃圾回收
大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...
- JVM 内存分配和垃圾回收(GC)机制
一 判断对象是否存活 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“活着”,哪些已经"死去”,即不能再被任何途径使用的对象. 1.1 引用计数法 (Reference ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- CLR、内存分配和垃圾回收
一.CLR CLR:即公共语言运行时(Common Language Runtime),是中间语言(IL)的运行时环境,负责将编译生成的MSIL编译成计算机可以识别的机器码,负责资源管理(内存分配和垃 ...
- 浅析JVM内存区域及垃圾回收
一.JVM简介 JVM,全称Java Virtual Machine,即Java虚拟机.以Java作为编程语言所编写的应用程序都是运行在JVM上的.JVM是一种用于计算设备的规范,它是一个虚构出来的计 ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
随机推荐
- HTML5 localStorage setItem getItem removeItem
HTML5 WEB存储中提供了两种客户端的数据存储方法:localStorage 还有sessionStorage localStorage: localStorage 方法存储的数据没有时间限制.第 ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
- ImportError: cannot import name 'Document'
一种常见的原因是,程序文件的名字不对. 程序文件的名字不能和 import lib 里的名字冲突. 一个例子: 如果程序文件名字是 docx.py,程序又 from docx import Docum ...
- Python之 反射、迭代器、生成器
反射 反射就是通过 内置函数getattr() 以字符串的形式导入模块,以字符串的形式调用模块/对象里方法 l=['add','del','set','find'] for i in l: print ...
- [flask_sqlalchemy ]插入数据时发生错误后如何处理
示例代码: def add_supplier(): form = request.form if request.method == 'POST': print(form) supplier = Su ...
- 一键发布shell脚本
1.配置集群间免密登录 (1)配置host:vim /etc/hosts (2)生成公钥 :ssh-keygen -t rsa -P '' 这时会提示生成的公钥的存放地址,直接回车,公钥生成成功 (3 ...
- 针对C++容器类的一个简陋的allocator
参考: https://en.cppreference.com/w/cpp/named_req/Allocator http://www.josuttis.com/libbook/memory/mya ...
- 24个MySQL面试题
一.为什么用自增列作为主键? 1.如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引. 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作 ...
- [Vuejs] 给ref赋值需要注意的问题
1.简单赋值 <div ref="refCon"></div> 访问方式: this.$refs.refCon 2.循环赋值,相同名称 <div v- ...
- navicat连接 mysql报错1251解决方案
转自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客, ...