eden

JVM 内存模型

安稳与你 提交于 2019-12-01 00:54:34
作为JAVA开发,必须要了解JVM,了解JVM 内存模型的相关知识是每个程序开发者必备的。 JVM 内存模型 JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。 此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 虚拟机栈 线程私有,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型: 每个方法被执行的时候都会同时创建一个栈帧

jvm 内存分配

我是研究僧i 提交于 2019-11-30 06:39:23
java堆内存概述 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap) .从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。 进一步划分的目的是更好地回收内存,或者更快地分配内存。 一般情况下:新生代:老年代 比例为 1:3 而对于新生代代来说:Eden:From:to为8:1:1 常见的分配策略: 对象优先在 eden 区分配 目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 大多数情况下,对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC.下面我们来进行实际测试以下。 在测试之前我们先来看看 Minor GC 和 Full GC 有什么不同呢? 新生代 GC(Minor GC) :指发生新生代的的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。 老年代 GC(Major GC

2019java 面试

我怕爱的太早我们不能终老 提交于 2019-11-30 03:07:51
面试基础 谈谈一致hash算法? 按照hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间。将这些数字头尾相连,想象成一个闭合的环形。如果集群中加入新的机器,采用它的IP或者唯一别名计算哈希值,也映射到环中。新增key值以顺时针的方向,存储到离自己最近的机器中。 参考: https://blog.csdn.net/cb_lcl/article/details/81448570 说说乐观锁和悲观锁? 乐观锁:假设每次操作别人不会修改数据,当更新的时候根据版本号判断数据是否变化,适合读多写少的场景。 悲观锁:假设每次操作别人会修改数据,操作前先加上锁,后面的操作被阻塞,直至操作完毕释放锁。 说说对MySQL的了解,和Oracle的区别? MySQL是一种开源关系型数据库,支持标准的SQL语言,支持多种数据引擎、事务、主从配置。广泛用于中小型互联网公司。与Oracle的区别: 定位:Oracle是大型数据库,Mysql是中小型数据库。Oracle是付费的商业数据库,MySQL是免费开源数据库。 性能:Oracle有更强的并发性能,更丰富的数据管理工具。 说说事务四大特性? A(原子性):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 C(一致性):事务前后数据的完整性必须保持一致,符合逻辑运算。 I(隔离性)

Java系列笔记

て烟熏妆下的殇ゞ 提交于 2019-11-29 23:22:07
Java垃圾回收概况   Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。   关于JVM,需要说明一下的是,目前使用最多的Sun公司的JDK中,自从1999年的JDK1.2开始直至现在仍在广泛使用的JDK6,其中默认的虚拟机都是HotSpot。2009年,Oracle收购Sun,加上之前收购的EBA公司,Oracle拥有3大虚拟机中的两个:JRockit和HotSpot,Oracle也表明了想要整合两大虚拟机的意图,但是目前在新发布的JDK7中,默认的虚拟机仍然是HotSpot,因此本文中默认介绍的虚拟机都是HotSpot,相关机制也主要是指HotSpot的GC机制。   Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC。经过这么长时间的发展(事实上

JVM系列_内存分配与回收策略

自闭症网瘾萝莉.ら 提交于 2019-11-29 21:53:15
一. 概述 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的 规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟 机中与内存相关的参数的设置。 二. 内存分配解析 对象内存分配图: 1. 对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。 虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前的内存各区域分配情况 。在实际应用中,内存回收日志一般是打印到文件后通过日志工具进行分析,不过本实验的日志并不多,直接阅读就能看得很清楚。 代码示例1中,尝试分配 3个2MB大小和1个4MB大小的对象 , 在运行时通过 -Xms20M、-Xmx20M、-Xmn10M 这3个参数限制了 Java堆大小为20MB,不可扩展 ,其中 10MB分配给新生代 ,剩下的 10MB分配给老年代 。 -XX:SurvivorRatio = 8决定了新生代中Eden区与一个Survivor区的空间比例是8:1 ,从输出的结果也可以清晰地看到“ eden space

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

三世轮回 提交于 2019-11-29 21:39:57
年轻代与老年代的调优(笔记整理) 几个常见名词 年轻代(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

java内存模型和垃圾回收

混江龙づ霸主 提交于 2019-11-29 21:29:10
摘抄并用于自查 JVM内存模型   1. Java程序具体执行的过程:  Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文件,加载完毕后,交由JVM执行引擎执行 在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的 数据和相关信息 ,这段空间一般被称作为 Runtime Data Area(运行时数据区),也就是我们常说的JVM内存 因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)   2. JVM的内存划分和各区域职责:     程序计数器:程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直到执行完所有的指令。(注:JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是逻辑作用上是等同的,在JVM中多线程是通过线程轮流切换来获得CPU执行时间的,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令

从头到尾说一次 Java 垃圾回收,写得非常好! (转)

浪尽此生 提交于 2019-11-29 09:58:19
  之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员。🤔   确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的专注,很多初学者不懂 GC,也依然能写出一个能用甚至还不错的程序或系统。但其实这并不代表 Java 的 GC 就不重要。相反,它是那么的重要和复杂,以至于出了问题,那些初学者除了打开 GC 日志,看着一堆0101的天文,啥也做不了。😯   今天我们就从头到尾完整地聊一聊 Java 的垃圾回收。 什么是垃圾回收   垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。   Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放空间,既要写构造函数,又要写析构函数,很多时候都在重复的 allocated,然后不停的析构。于是,有人就提出,能不能写一段程序实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢?   1960年,基于 MIT 的 Lisp 首先提出了垃圾回收的概念,而这时 Java 还没有出世呢! 所以实际上 GC

Java基础 - 从头到尾说一次 Java 垃圾回收(转)

ⅰ亾dé卋堺 提交于 2019-11-29 09:40:55
之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员。🤔 确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的专注,很多初学者不懂 GC,也依然能写出一个能用甚至还不错的程序或系统。但其实这并不代表 Java 的 GC 就不重要。相反,它是那么的重要和复杂,以至于出了问题,那些初学者除了打开 GC 日志,看着一堆0101的天文,啥也做不了。😯 今天我们就从头到尾完整地聊一聊 Java 的垃圾回收。 什么是垃圾回收 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。 Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的 allocated,然后不停的析构。于是,有人就提出,能不能写一段程序实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年,基于 MIT 的 Lisp 首先提出了垃圾回收的概念,而这时 Java 还没有出世呢! 所以实际上 GC 并不是Java的专利,GC

java内存机制

这一生的挚爱 提交于 2019-11-28 23:25:24
Java内存主要有堆内存、栈内存和寄存器。栈是运行时的单位,堆是存储时的单位。 堆内存主要是存储对象、类的静态方法、静态变量、成员变量。 栈主要存储方法、局部变量、java基本类型、堆中对象实例的引用。 一个对象的大小是不可估计的,但是在栈中,一个对象只对应了4kb的引用。 基本类型:byte、short、int、long、char、float、double、Boolean 引用类型:类、接口、数组 Java中的参数传递时是传值还是传引用? 程序允许是在栈中运行,所以在参数传递的时候,只传递基本类型和对象引用,不会直接传递对象本身。在运行栈中,基本类型和引用类型都是一样的,都是传值。所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修改是可以保持的了。 对象,从某种意义上说,是由基本类型组成的。 对象的大小? 一个空的对象,在栈中存储基本的引用4kb,一个在堆中的空的object对象的大小是8kb,因此一个对象最少是12kb,但是空间占用一般是8的倍数,所以应该是16kb。 引用类型? 一般分为强引用,软引用,弱引用。