堆
JVM管理的内存叫堆。在32Bit操作系统上有1.5G-2G的限制,而64Bit,我可以设到64G,再往上就没试过了。
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64。
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。
默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。
服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小,所以上面的两个参数没啥用。
基本收集算法
复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。
因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
标记清除:收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。
标记整理:综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。
什么是分代
根据对象的生命周期长短,把堆分为3个代:年青代、年老代、持久代,根据各自的特点分别采用合适的回收算法。
年轻代:这类对象都是随生随灭的。因此所有收集器都为年轻代选择了复制算法。
复制算法优点是只访问活跃对象,缺点是复制成本高。因为年轻代只有少量的对象能熬到垃圾收集,因此只需少量的复制成本。而且复制收集器只访问活跃对象,对那些占了最大比率的死对象视而不见,充分发挥了它遍历空间成本低的优点。
Young的默认值为4M,随堆内存增大,约为1/15,JVM会根据情况动态管理其大小变化。
-XX:NewRatio= 参数可以设置Young与Old的大小比例,-server时默认为1:2,但实际上young启动时远低于这个比率。如果信不过JVM,也可以用-Xmn硬性规定其大小,有文档推荐设为Heap总大小的1/4。
Young里面又分为3个区域,一个Eden,所有新建对象都会存在于该区,两个Survivor区,用来实施复制算法。每次复制就是将Eden和第一块 Survior的活对象复制到第2块,然后清空Eden与第一块Survior。Eden与Survivor的比例由 -XX:SurvivorRatio=设置,默认为32。Survivio大了会浪费,小了的话,会使一些年轻对象潜逃到老人区,引起老人区的不安,但这个参数对性能并不重要。
年老代:年轻代的对象如果能够挺过数次收集,就会进入老人区。老人区使用标记整理算法。因为老人区的对象都没那么容易死的,采用复制算法就要反复的复制对象,很不合算,只好采用标记清理算法,但标记清理算法其实也不轻松,每次都要遍历区域内所有对象。-XX:MaxTenuringThreshold=设置熬过年轻代多少次收集后移入老人区,熬过第一次GC就转入,可以用-XX:+PrintTenuringDistribution查看。
持久代:装载Class信息等基础数据,默认64M,如果是类很多很多的服务程序,需要加大其设置 -XX:MaxPermSize=,否则它满了之后会引起fullgc()或Out of Memory。Spring,Hibernate这类喜欢AOP动态生成类的框架需要更多的持久代内存。
分享到:
相关推荐
MinorGC 的过程(复制->清空->互换)1: eden, servicorFrom 制到 ServicorTo, 年龄+1..2:清空eden, servicorFrom..3: ServicorTo 和 ServicorFrom互换,2.3.2. 老年代.2.3.3. 永久代2.3.3.1. JAVA8 与元数据.2.4. 垃圾...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
java面试各大知识点,非常齐全。jvm内存分区,gc算法,类加载机制。并发编程,并发编程各大容器,锁。框架spring mybatis原理,组件介绍。架构设计有设计模式,负载均衡。网络有协议,java 高并发io框架netty。数据...
面试资料pdf、JAVA核心知识点整理 2 JVM、2.1线程、2.2JVM内存区域、JVM运行时内存(新生代、Eden区、ServivorFrom、ServivorTo、MinorGC的过程、老年代、永久代)、2.4垃圾回收与算法 2.5java四种引用类型 2.6 GC分...
java核心知识整理,jvm 线程 锁 集合 并发 数据库 网络
java面试各大知识点,非常齐全。jvm内存分区,gc算法,类加载机制。并发编程,并发编程各大容器,锁。框架spring mybatis原理,组件介绍。架构设计有设计模式,负载均衡。网络有协议,java 高并发io框架netty。数据...
包含java多线程并发,GC回收算法,java集合,java基础知识,JVM,java并发编程,spring,微服务,设计模式,数据库,分布式,算法,各种第三方组件等
自己看书整理的 java虚拟机精品知识点 java内存区域与内存溢出处理 虚拟机栈和本地方法栈区别 对象定位访问 垃圾收集器GC管理 虚拟机GC垃圾回收收集算法(内存回收方法论) 虚拟机GC垃圾回收收集器(内存回收具体实现...
MinorGC 的过程(复制->清空->互换) ....................................................................................... 24 1:eden、servicorFrom 复制到 ServicorTo,年龄+1.................................
包含 基础知识点和核心知识点 2.1. 线程 ...................................................................................................................................................... 20 2.2. ...
2.3.1.4.MinorGC的过程(复制->清空->互换) 1:eden、servicorFrom复制到ServicorTo,年龄+1 2:清空eden、servicorFrom 3:ServicorTo和ServicorFrom互换 2.3.2.老年代 2.3.3.永久代 2.3.3.1.JAVA8与元数据 2.4....
Java后端面试知识点总结,涉及JVM • 熟悉JVM内存区域,常用引用类型,垃圾回收机制、算法以及常见的GC垃圾收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1) • 熟悉常用IO模型(BIO、...
JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...
本期内容包括JUC多线程并发、JVM和GC等目前大厂笔试中会考、面试中会问、工作中会用的高频难点知识。上半场,从多线程并发入手,分层递进讲解,逐步让大家掌握volatile、原子类和原子引用、CAS、ABA、Java锁机制、...
有些知识请各位同学明鉴,此外我后续会根据 《深入理解Java虚拟机 - 第三版》的内容来做更新和修改。 JVM运行时内存分区 以HotSpot为例: JDK8之前: 线程私有的部分有:程序计数器(PC寄存器),JAVA虚拟机栈,本地...
一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...
关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...
写Go还是Java? 性能优化究竟应该怎么做?【Go 夜读】 5个编写技巧,有效提高单元测试实践 DotNet dotNetCore面试题 杨中科:谁说.NET没有GC调优? .NET内存性能分析指南 DbContext 生存期、配置和初始化 ASP.NET ...
下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,以及串行并行并发G1等各种垃圾收集器的优化实践。 无论是进入职场不久的初级程序员,还是技术长期没有成长、正在吃老本走下坡路但还想涨...
而jvm又是面试常考的,我现在来总结一下jvm相关知识,而对于不同版本的jdk,又有许多不同的地方,为此我看了许多博客发现越看越晕,于是我只搜索了最近一年发表的jvm相关博客,并进行了整理。下面我将从这几个方面来...