eden

年轻代与老年代的调优笔记

匿名 (未验证) 提交于 2019-12-03 00:08:02
年轻代与老年代的调优(笔记整理) 几个常见名词 年轻代(young 区) 从年轻代空间(包括Eden和Survivor 区域)回收内存被称为 Minor GC 空间太小可能导致对象直接进入 old区 。如果old区 满了,会触发full gc。但也不能过大,过大会引起回收耗时过长,导致应用阻塞。 老年代(old 区) 从老年代GC称为Major GC 空间过小会产生old区小碎片,放不下大对象,引起频繁full gc。如果用了缓存,old区也要适当大些,同时缓存不应无限增长。 存活区(Survivor) Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。 伊甸园(Eden) 整个堆内存(heap)=young+old GC(垃圾回收机制) 堆区有两个Survivor区,新建的对象会存活在在Eden中。Eden区如果没有足够的空间时会引发一次young区的GC。 在经历一次MinorGC之后,Eden中的存活对象就会被移动到第一块survivor space-S0,此时Eden被清空; 等Eden区再次填满,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space-s1;此时S0和Eden被清空,然后下一轮S0与S1交换角色。 如果 Survivor的空间不足或经历16次Minor

JVM调优总结

人盡茶涼 提交于 2019-12-02 23:49:29
目录 数据类型 堆与栈 Java对象的大小 引用类型 按照基本回收策略分 按分区对待的方式分 按系统线程分 如何区分垃圾 如何处理碎片 如何解决同时存在的对象创建和对象回收问题 为什么要分代 如何分代 什么情况下触发垃圾回收 分代垃圾回收流程示意 选择合适的垃圾收集算法 小结 回收器选择 辅助信息 常见配置汇总 调优总结 垃圾回收的瓶颈 增量收集的演进 Garbage Firest(G1) 展望 JVM调优工具 如何调优 线程监控 内存泄漏检查 垃圾回收的悖论 我们的内存中都放了什么 解决之道 转载: JVM调优总结(一)-- 一些概念 转载: JVM调优总结(二)-- 一些概念 转载: JVM调优总结(三)-- 基本垃圾回收算法 转载: JVM调优总结(四)-- 垃圾回收面临的问题 转载: JVM调优总结(五)-- 分代垃圾回收详述1 转载: JVM调优总结(六)-- 分代垃圾回收详述2 转载: JVM调优总结(七)-- 典型配置举例1 转载: JVM调优总结(八)-- 典型配置举例2 转载: JVM调优总结(九)-- 新一代的垃圾回收算法 转载: JVM调优总结(十)-- 调优方法 转载: JVM调优总结(十一)-- 反思 一些概念 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身

jvm参数调优

匿名 (未验证) 提交于 2019-12-02 23:05:13
13 1 eden 2 3 s1 2 堆初始值 堆最大可用值 -Xmn 新生代最大可用值 一般为堆大小的1/3或者1/4 -XX:SurvivorRatio 设置新生代中eden空间和from/to空间的比例 -XX:SurvivorRatio=eden/from=eden/to -XX:NewRatio 设置老年代和新生代比例 -XX:NewRatio=老年代/新生代 1 2 3 1:31:41/31/4 // 3:1 -Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+UseSerialGC package com.linxi.jia; /** * Created by 156 on 2019/2/13. */ public class JvmDemo02 { // public static void main(String[] args) { //-Xms20m -Xmx20m -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+PrintGCDetails -XX:+UseSerialGC byte [] b = null; for (int i = 0; i < 2; i++) { b =new byte[1*1024*1024]; } } }

Java虚拟机知识点【GC】

匿名 (未验证) 提交于 2019-12-02 21:52:03
标记-清除算法 效率不高 ,而且存在 内存碎片 的问题。 复制算法 标记-整理算法 分代收集算法 新建的对象优先分配在Eden区; 当Eden区满了,就会触发Minor GC,Eden中的存活对象被移动到Survivor0,Eden被清空; 等Eden区再满了,再次触发Minor GC,Eden和Survivor0中的存活对象又会被复制到Survivor1,S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。 当两个Survivor区切换了几次(HotSpot虚拟机默认15次)之后,仍然存活的对象,将被复制到老年代。 Minor GC :发生在新生代的GC,因为Java对象都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。 Major GC/Full GC :发生在老年代年的GC,出现Full GC经常伴随至少一次的Minor GC(非绝对,如Parallel Scavenge)。Full GC的速度一般会比Minor GC慢10倍以上,所以要合理设置年轻代与老年代的大小, 尽量减少Full GC 的操作。 当Eden区满时触发。 调用System.gc时,系统会建议执行Full GC,但是不一定执行。 老年代空间不足时触发。 方法区(永久代/元空间)空间不足时触发。 通过Minor GC后进入老年代的平均大小大于老年代的可用连续内存时触发。

JVM运行时内存结构

时间秒杀一切 提交于 2019-12-02 20:09:54
JVM运行时内存结构 JVM内存模型 JVM运行时内存=共享内存区+线程内存区 共享内存区 共享内存区=持久代+堆 持久代=方法区+其他 堆=Old Space+Young Space Young Space=Eden+S0+S1 持久代 JVM用持久代(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。 可通过-XX:PermSize和-XX:MaxPermSize来指定持久代初始化值和最大值。 Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。 堆 堆,主要用来存放类的对象实例信息。 堆分为Old Space(又名,Tenured Generation)和Young Space。 Old Space主要存放应用程序中生命周期长的存活对象; Eden(伊甸园)主要存放新生的对象; S0和S1是两个大小相同的内存区域,主要存放每次垃圾回收后Eden存活的对象,作为对象从Eden过渡到Old Space的缓冲地带(S是指英文单词Survivor Space)。 堆之所以要划分区间,是为了方便对象创建和垃圾回收,后面垃圾回收部分会解释 线程内存区 线程内存区=单个线程内存+单个线程内存+.....

JVM对象及垃圾回收处理

蓝咒 提交于 2019-12-02 13:38:11
JVM对象及垃圾回收处理 对象创建 • 给对象分配内存 • 线程安全性问题 • 初始化对象 • 执行构造方法 给对象分配内存 指针碰撞 假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离 空间列表 如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录 \(\color{red}{线程安全性问题}\) 在并发情况下,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。解决这个问题有两种方案: 线程同步 对分配内存空间的动作进行 同步处理 ——实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性 本地线程分配缓冲(TLAB) 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为 本地线程分配缓冲(Thread Local Allocation Buffer,TLAB) 。哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定

JVM常见面试题

南笙酒味 提交于 2019-12-02 05:05:45
内存模型以及分区,需要详细到每个区放什么。 栈区: 栈分为java虚拟机栈和本地方法栈 重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。 每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。每个方法从被调用,直到被执行完。对应着一个栈帧在虚拟机中从入栈到出栈的过程。 通常说的栈就是指局部变量表部分,存放编译期间可知的8种基本数据类型,及对象引用和指令地址。局部变量表是在编译期间完成分配,当进入一个方法时,这个栈中的局部变量分配内存大小是确定的。 会有两种异常StackOverFlowError和 OutOfMemoneyError。当线程请求栈深度大于虚拟机所允许的深度就会抛出StackOverFlowError错误;虚拟机栈动态扩展,当扩展无法申请到足够的内存空间时候,抛出OutOfMemoneyError。 本地方法栈为虚拟机使用到本地方法服务(native) 堆区: 堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。 堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区最要放新创建对象,From survivor 和 To survivor 保存gc后幸存下的对象,默认情况下各自占比 8:1:1。 不过很多文章介绍分为3个区块,把方法区算着为永久代。这大概是基于Hotspot虚拟机划分

JVM调优浅谈

蹲街弑〆低调 提交于 2019-12-02 03:17:12
1. 数据类型 java 虚拟机中,数据类型可以分为两类:基本类型和引用类型。 基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。 “引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte、short、int、long、char、float、double、boolean 引用类型包括:类类型、接口类型和数组 byte 1B(8位) -128 ~ 127 0 short 2B(16位) -2 15 ~ 2 15 -1 0 Int 4B(32位) -2 31 ~ 2 31 -1 0 long 8B(64位) -2 63 ~ 2 63 -1 0 char 2B(16位) 0 ~ 2 16 -1 \U0000 float 4B(32位) 1.4013E-45 ~3.4028E+38 0.0F double 8B(64位) 4.9E-324 ~1.7977E+308 0.0D boolean 1B(8位) True, false false 2. 堆( heap )与栈( stack ) 堆和栈是程序运行的关键,很有必要它他们的关系说清楚。 在java中,Main函数就是栈的起始点,也是程序的起始点。程序要运行总是有一个起点的(程序执行的入口)。 概括: 1 栈是运行时的单位 , 而堆是存储的单元 。

Java GC

一笑奈何 提交于 2019-12-01 18:36:14
转自: https://www.cnblogs.com/wjtaigwh/p/6635484.html GC :Garbage Collections 字面意思是垃圾回收器,释放垃圾占用的空间。让创建的对象不需要像c、c++那样delete、free掉 。对于c、c++的开发人员来说内存是开发人员分配的,也就是说还要对内存进行维护和释放。对于Java程序员来说,一个对象的内存分配是在虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,但是,如果出现了内存泄露和内存溢出问题,而开发者又不了解虚拟机是怎么分配内存的话,那么定位错误和排除错误将是一件很困难的事情。(这里留一个问题给大家思考一下,在什么情况下会出现内存泄露和内存溢出问题)   从上面的了解我们知道,内存的分配是在JVM虚拟机的自动内存分配机制下完成的,所以我们现在来简单的了解一下JVM的内存管理结构,如图:    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 JVM运行时数据区 ①程序计数器(Program Counter Register)   程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法为

堆和堆参数调优

二次信任 提交于 2019-12-01 08:01:35
一、再议永久代和方法区   上一篇提到:在8版本以前,JVM采用堆空间的一部分实现方法区,这部分堆空间被称为“永久代”,由于类的结构信息和运行时常量池是放在方法区的,使用永久代实现方法区容易导致堆内存溢出。在8版本推出以后,Java采用了堆外内存即本机物理内存实现方法区,我们把这部分空间称为“元空间”。       二、堆内存   众所周知,当线程new了一个对象后,对象的引用变量存放在栈针中,而对象本身存储在堆内存中,如果大量的对象存储在堆内存而无法被GC回收,那么将导致OOM错误,那么堆空间多大呢?GC的工作流程是什么样呢?可以设置堆空间大小吗?可以选择GC工作方式吗?   1、堆内存结构以及GC过程:      新生代空间:老年代空间 = 1 : 3,而其中新生代中Eden : from :to区域=8:1:1   新生代是实例对象诞生的区域,也是绝大多数实例对象消亡的区域,新生代分为两个区域:Eden区和Survivor区,Survivor区又分为SurvivorFrom区和SurvivorTo区。所有的对象都是在Eden区被new出来的。当Eden区满时会触发第一次GC,把幸存下来的对象会被 “复制”到From区 。如果Eden区再此触发GC,此时GC会扫面Eden区和From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象会直接复制到To区,并为这些对象的“年龄