eden

JVM虚拟机 与 GC 垃圾回收

懵懂的女人 提交于 2020-02-12 16:31:24
一、JVM体系结构概述 1、JVM 与系统、硬件 ​ JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2、JVM 体系结构概览 ​ 3、类装载器ClassLoader 执行原理 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 ​ 4、类装载器ClassLoader装载流程(双亲委派) ​ 虚拟机自带的加载器 启动类加载器(Bootstrap)C++ 扩展类加载器(Extension)Java 应用程序类加载器(AppClassLoader)Java 也叫系统类加载器,加载当前应用的classpath的所有类 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式 注 : Execution Engine执行引擎负责解释命令,提交操作系统执行。 ​ 5、Native Interface本地接口 本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法

JVM内存模型

我们两清 提交于 2020-02-11 14:42:45
对于Java开发人员来说,了解Java内存模型是必不可少的知识。 JVM内存模型 在生产环境上一般会配置JVM参数以充分利用硬件资源,不管是在云主机或容器里面,也就是在启动应用时添加下面的某些配置: -XmsSetting —初始堆大小 -XmxSetting —最大堆大小 -XX:NewSizeSetting —新一代堆大小 -XX:MaxNewSizeSetting —最大新一代堆大小 -XX:MaxPermGenSetting —永久生成的最大大小 -XX:SurvivorRatioSetting —新的堆大小比率(例如,如果Young Gen大小为10m并且内存开关为–XX:SurvivorRatio=2,则将为Eden空间保留5m,为两个Survivor空间分别保留2.5m,默认值= 8) -XX:NewRatio —提供新旧大小的比率(默认值= 2) 就像任何其他软件一样,JVM占用主机OS内存上的可用空间。 在JVM内部存在单独的内存空间(堆、非堆和缓存),用来存储运行时数据和编译后的代码。 堆内存 堆分为两部分:年轻一代(Young Generation)和老一代(Old Generation) JVM启动时分配堆(初始大小:-Xms) 应用程序运行时堆大小增加/减少 最大大小:-Xmx 世代假设(Generational Hypothesis)

JVM分代垃圾回收策略的基础概念

天涯浪子 提交于 2020-02-09 03:27:32
一、为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。 试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。 因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适 合它的垃圾回收方式进行回收。 二、如何分代 如图所示: 虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。 其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大

JVM垃圾回收机制

瘦欲@ 提交于 2020-02-09 03:21:30
转自:http://www.importnew.com/1551.html 每个Java程序员迟早都会碰到下面这个错误: java.lang.OutOfMemoryError 这个时候一般会建议采用如下方式解决这个错误: 增加MaxPermSize值 增加最大堆内存到512M(-xmx参数) 这篇文章会具体介绍Java堆空间和参数MaxPermSize的含义。这篇文章涉及下列主题,并采用Hotspot JVM: 垃圾回收器(Garbage Collector,GC) 哪个 JVM? JVM命令行选项 垃圾回收器 垃圾回收器负责: 分配内存 保证所有正在被引用的对象还存在于内存中 回收执行代码已经不再引用的对象所占的内存 应用执行时,定位和回收垃圾对象的过程会占用总执行时间的将近25%,这会拖累应用的执行效率。 Hotspot VM提供的垃圾回收器是一个分代垃圾回收器(Generational GC)[9,16,18]-将内存划分为不同的阶段,也就是说,不同的生命周期的对象放置在不同的地址池中。这样的设计是基于弱年代假设(Weak Generational Hypothesis): 1.越早分配的对象越容易失效; 2.老对象很少会引用新对象。 这种分代方式可以减少垃圾回收的停顿时间以及大范围对象的回收成本。Hotspot VM将其堆空间分为三个分代空间: 1. 年轻代 ( Young

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

我们两清 提交于 2020-02-08 16:14:59
  相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋。 一、 技术背景你要了解吧 二、 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Java中的引用你了解多少 2.4 对象死亡(被回收)前的最后一次挣扎 2.5 方法区如何判断是否需要回收 三、常用的垃圾收集算法 3.1 标记-清除算法 3.2 复制算法 3.3 标记-整理算法 3.4 分代收集算法 3.4.1 年轻代(Young Generation)的回收算法 3.4.2 年老代(Old Generation)的回收算法 3.4.3 持久代(Permanent Generation)的回收算法 四、常见的垃圾收集器 五、GC是什么时候触发的(面试最常见的问题之一) 5.1 Scavenge GC 5.2 Full GC 结束语 一、 技术背景你要了解吧   按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术

Java内存

試著忘記壹切 提交于 2020-02-06 16:06:36
Java 虚拟机在执行 Java 程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java 虚拟机规范将 JVM 所管理的内存分为以下几个运行时数据区:程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区。 一,内存区域划分   1.线程共享区域:     (1)Java堆(对象实例),GC的主要区域,会出现OutOfMemoryError     (2)方法区(加载的类信息,常量,静态变量,即时编译器编译后的代码)会出现OutOfMemoryError   2.线程私有区域:     (1)虚拟机栈(操作数栈,动态链接,方法返回地址,局部变量)       用于支持虚拟机进行方法方法调用和方法执行的数据结构。生命周期与线程相同,每个方法执行时会创建一个栈帧并入栈,对于执行引擎,活动线程中,只有栈顶的栈帧是有效的,称为当前栈帧,所关联的方法称为当前方法。       如果申请的栈深度大于虚拟机允许的栈深度则抛出StackOutflowError       如果在动态扩展时,无法申请到足够的内存则抛出OutOfMemoryError       单线程:无论是栈空间太大,还是虚拟机内存太小,抛出的都是StackOutflowError       多线程:抛出OutOfMemoryError         局部变量表:是一组变量值存储空间

Java垃圾回收之复制算法详解

本小妞迷上赌 提交于 2020-01-31 13:41:25
转载自:https://www.jb51.net/article/149608.htm 概述 如果jvm使用了coping算法,一开始就会将可用内存分为两块,from域和to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理。 应用场景 coping算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用coping算法进行拷贝时效率比较高。 jvm将Heap 内存划分为新生代与老年代,又将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区) ,然后在Eden –>Survivor Space 以及From Survivor Space 与To Survivor Space 之间实行Copying 算法。 不过jvm在应用coping算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。一般的jvm都是8:1。也即是说,Eden区:From区:To区域的比例是 8:1:1 始终有90%的空间是可以用来创建对象的,而剩下的10%用来存放回收后存活的对象。 1、当Eden区满的时候,会触发第一次young gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发young

HDU5977-Garden of Eden-树分治+FWT

血红的双手。 提交于 2020-01-28 11:49:36
题目描述 When God made the first man, he put him on a beautiful garden, the Garden of Eden. Here Adam lived with all animals. God gave Adam eternal life. But Adam was lonely in the garden, so God made Eve. When Adam was asleep one night, God took a rib from him and made Eve beside him. God said to them, “here in the Garden, you can do everything, but you cannot eat apples from the tree of knowledge.” One day, Satan came to the garden. He changed into a snake and went to live in the tree of knowledge. When Eve came near the tree someday, the snake called her. He gave her an apple and persuaded her

JVM堆(heap)

我的未来我决定 提交于 2020-01-24 14:12:23
概念: 一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三部分: 一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。 java7堆内存逻辑上分为三部分: 新生+养老+永久 java8堆内存逻辑上分为三部分: 新生+养老+元空间 (java7之前的图) 新生区 新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分: 伊甸区(Eden space)和幸存者区(Survivor pace) ,所有的类都是在伊甸区被new出来的。幸存区有两个: 0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存 0区。若幸存 0区也满了,再对该区进行垃圾回收,然后移动到 1 区。那如果1 区也满了呢?再移动到养老区。若养老区也满了,那么这个时候将产生MajorGC(FullGC)

大话Java堆的分区:Eden、From Survivor、To Survivor、老年代

人走茶凉 提交于 2020-01-15 03:55:20
Java虚拟机运行时数据区一般分为:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。 在《Java虚拟机规范》中对Java堆是这样描述的:“所有的对象实例以及数组都应当在Java堆上分配”。如果对Java堆进行细分地话,又可以分为新生代(包含Eden空间、From Survivor空间、ToSurvivor空间)和老年代。 由来 不喜欢看历史的可以先看后面内容。之所以将Java堆又细分为新生代和老年代的原因不是因为《Java虚拟机规范》对这一块数据区域有进一步地划分。 而是Sun/Oracle JDK和Open JDK中默认使用的HotSpot虚拟机在G1垃圾收集器出现以前,所有使用的垃圾收集器全部都是基于“分代收集理论”来设计的。 也就是说把Java堆固定划分为两个区域,针对各自区域中存储数据的特点,一种垃圾收集器工作在新生代,另一种垃圾收集器工作在老年代,二者配合共同完成垃圾收集工作。所以对Java堆的进一步细分完全是为了方便进行垃圾收集。 但是到了今天,再这么说就值得商量了。用《深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)》作者的原话讲就是: 但是到了今天,垃圾收集器技术与十年前已不可同日而语,HotSpot里面也出现了不采用分代设计的新垃圾收集器,在按照上面的提法就有很多需要商榷的地方了。 我理解的意思就是说,面试官想跟你聊新生代、老年代