似大地水准面quasi-geoid 似大地水准面(quasi-geoid)是正常高的起算面,指从地面点沿正常重力线按正常高相反方向量取到正常高端点所构成的曲面。...从地面点沿正常重力线量取正常高所得端点构成的封闭曲面。似大地水准面严格说不是水准面,但接近于水准面,只是用于计算的辅助面。它与大地水准面不完全吻合,差值为正常高与正高之差。...大地高等于正常高与高程异常之和,GPS测定的是大地高,要求解正常高必须先知道高程异常。...在实践中,地形图上标出的高度是海拔高,GPS读出的高度是大地高。 正高与正常高 海拔高 分为 正高与正常高。 地球表面上某点沿铅锤方向到大地水准面上的高程叫做正高,可以说是我们平常理解的海拔。...关系 大地高=正高+大地水准面差距; 大地高=正常高+高程异常。
如果你使用 Java 语言去开发,你就会发现大多数情况下你不用去关心无用对象的回收与内存的管理,因为这一切 JVM 虚拟机已经帮我们做好了。...了解 JVM 内存的各个区域将有助于我们深入了解它的管理机制,避免出现内存相关的问题和高效的解决问题。...直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域,但是却是NIO 操作时会直接使用的一块内存,虽然不受虚拟机参数限制,但是还是会受到本机总内存的限制,会抛出...它也是 JVM 垃圾回收作用的区域。...TLAB:为每一个线程预先在 Eden 分配一块内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,如果不够,使用 CAS 进行分配。
JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧....因此最近抽时间研读了几本评价较高的JVM入门书籍, 算是总结于此....JVM 内存区域 JVM会将Java进程所管理的内存划分为若干不同的数据区域. 这些区域有各自的用途、创建/销毁时间: ? 一....直接内存 直接内存并不是JVM运行时数据区的一部分, 但也会被频繁的使用: 在JDK 1.4引入的NIO提供了基于Channel与Buffer的IO方式, 它可以使用Native函数库直接分配堆外内存,...异常. ---- HotSpot对象 对象新建 new一个Java Object(包括数组和Class对象), 在JVM会发生如下步骤: 1.对分配内存空间的动作进行同步 -采用 CAS配上失败重试 方式保证更新操作的原子性
身为一个职业的Java程序员,每天打交到最多的就是jvm,那么套用孙子的一句话“知己知彼方能百战不殆”,熟悉jvm也就意味着是我们进阶路上必过之槛,下面先来张图,大概说明下jvm的内存分布 ?...从图上可以看出Java内存主要分5个部分,下面会针对这5个部分分别进行说明 方法区:主要是保存的信息是类的元数据。方法区与堆空间类似,是被JVM中所有的线程共享的区域。...Java堆:堆在JVM规范里是一种通用性的内存池,用于存放所有的Java对象。堆是一个运行时数据区,类的对象从中分配空间,堆的优势是可以动态地分配内存大小,生存周期也不需要事先告诉编译器。...栈是一种快速有效的分配存储方法,访问速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。...由于Java虚拟机需要预先去生成相应的内存空间,所以但我们尝试运行程序的时候,Java虚拟机必须知道被存储在栈内的所有数据的确切大小和生命周期,以便按照上面陈述的分配存储方法通过上下移动堆栈指针来动态调整内存空间
是否有必要学习 JVM 为什么要了解 JVM 的内存划分或者内存管理呢?其实本身我觉得是没有太多必要的,因为作为一个普通的程序员而言,去了解它是一种破坏黑盒子的行为。...但是,JVM 提供了自动的内存管理机制,它的内存自动管理机制虽然有很多实现方式,但是在各种不同的场景下它不一定是最优的。...为什么进行内存划分 既然需要了解 JVM 的内存划分,那么就先说说 JVM 为什么要进行内存划分呢?这个其实比较好理解,因为这种划分区域的方式可以说随处可见。...当然了,虽然这是事实,但是也并不说明内存按属性划分的管理方式有问题) JVM 内存大致划分 JVM 作为虚拟机的存在可以被认为是一台独立的机器,.class 作为 JVM 上的可执行文件,因此,JVM...当堆中的对象不再使用时,JVM 会在某个时间点回收这些内存空间。
1 JDK1.7结构 1.1 JVM内存图 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令....在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。...Perm 永久区 Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError...PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题...JDK1.8 结构 2.1 JVM运行时内存图 JDK1.8和JDK1.7的jvm内存最大的区别是, 在1.8中方法区是由元空间(元数据区)来实现的,常量池移到堆中. 1.8不存在方法区,将方法区的实现给去掉了
二、JVM内存空间管理 根据JVM规范,JVM把内存划分了如下几个区域: 1. 方法区 2. 堆区 3. 本地方法栈 4. 虚拟机栈 5....在JVM所管理的内存中,堆区是最大的一块,堆区也是JavaGC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。...对于堆区大小,可以通过参数-Xms和-Xmx来控制,-Xms为JVM启动时申请的最新heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于...三、JVM内存分配 Java对象所占用的内存主要在堆上实现,因为堆是线程共享的,因此在堆上分配内存时需要进行加锁,这就导致了创建对象的开销比较大。...应用场景 CMS收集器主要用在应用程序对暂停时间要求很高的场景,比如桌面UI应用需要及时响应用户操作事件、服务器必须能快速响应客户端请求或者数据库要快速响应查询请求等等。
JVM在执行java程序时的过程中会把它所管理的内存划分为若干个不同的数据区域。...1、方法区(元数据空间) 方法区与Java堆一样,是各个线程共享的内存区域。方法区是jvm的元数据区域,类比成为一张表,一个class文件的信息都是表的一条数据存储在内存中。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 Java 堆是垃圾回收机制的主要区域。...当常量池无法在申请到内存时将抛出OutOfMenoryError错误。 6、直接内存 直接内存并不是JVM虚拟机运行时数据区的一部分,也不是JVM虚拟机规范中定义的内存区域。...此区域是JVM规范中没有规定任何OutOfMenoryError的区域。
B站搜索“乐哥聊编程“有本篇文章配套视频 https://www.bilibili.com/video/BV1rg411v7rw 面试题:直接内存会导致OOM么?...本地方法栈 本地方法栈和虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。也包括运行时常量池。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问
下面,以Java8为例,对JVM结构做一番总结。 1 JVM结构详解 首先,看下最新的JVM结构图: ?...所以它是一个“线程私有”的内存区域。此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。 ?...1.4 虚拟机栈(JVM Stacks) 虚拟机栈是线程私有的内存区域,生命周期与线程相同。...方法返回:无论方法是否正常完成,都需要返回到方法被调用的位置,程序才能继续进行。...默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。
栈 本地方法栈和虚拟机栈可以统称为栈,由于本地方法栈是jvm调用操作系统native方法所使用的栈且它们的作用是非常相似的,所以这里重点看一下虚拟机栈。...它描述的java方法执行的内存模型 为什么是Java方法执行的内存模型呢? 在虚拟机中,每一次方法调用都会创建栈帧,这个栈帧的生命周期就伴随着这个方法的执行周期。...方法返回地址 方法的返回分为两种情况 正常情况,方法正常执行完毕退出后会根据方法是否定义返回值来决定是否要传返回值给上层的调用者 执行过程中出现异常,异常导致的方法结束不会传返回值给上层的调者 两种方法返回在退出当前方法时都会跳转到当前方法被调用的位置...,如果方法是正常退出的,则调用者的PC计数器的值就可以作为返回地址,如果是因为异常退出的,则是需要通过异常处理表来确定 方法的的一次调用就对应着栈帧在虚拟机栈中的一次入栈出栈操作,因此方法退出时可能做的事情包括...Class.forName获取的引用 方法表 非抽象类、非接口的类才会有,一个保存类中所有的方法的数组,数组中每个每个元素是对每个方法的直接引用 运行时常量池 当类和接口被加载到JVM
总览 [image-20201021222746282] JVM标准中的五个组成部分 方法区 堆 程序计数器 本地方法栈 虚拟机栈 JDK1.7的运行时数据区 [image-20201021224100216...之后字符串常量池被移动到堆区 JDK1.8的运行时数据区 [image-20201021224342226] jdk1.8去掉了永久代 引入了元数据区 Jdk1.7中的运行时常量池移动到元数据区 元数据区存在于直接内存中...为什么移除永久代 方法区大小难以设定,容易发生内存溢出。...促进HotSpot VM和JRockit VM融合,JRockit VM没有方法区 什么是元空间 元空间和永久代类似都是对JVM规范中方法区的实现。...区别在于元空间不在JVM虚拟机中,因此元空间的空间受本地内存制约。
在Java开发中我们不用考虑对内存的管理,是因为Jvm帮我们做了很多工作。Jvm为了满足不同的用途将内存大体划分了下面几部分。如下图: ? 下面我们详细介绍一下每一块的具体的功能。...只不过不同的是,这个计数器不是针对程序来说的,而是真对线程来说的,因为每一个线程可能执行的逻辑是不一样的,所以Jvm就要知道每一个线程在上一次的执行位置。所以程序计数器,每一个线程都是独立的。...堆:Jvm中管理内存的最大的地方。它的作用是存储对象的实例。我们可以通过设置-Xmx和-Xms控制堆大小。堆也是Jvm中垃圾回收器回收的主要地方。并且堆内存是所有线程所共享的区域。...方法区:和堆一样也是所有线程共享的内存区域,不同是的是它主要存储被虚拟机加载的类信息、常量、静态变量等信息。 运行时常量池:常量池存放在方法区中,主要保存编译时生成的字面量和符号引用。
拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。...博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。
**主要结构:**堆内存、方法区、栈(说明:基于JDK1.7) 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor...此内存区域的唯一目的就 是存放对象实例,几乎所有的对象实例都在这里分配内存。...参数设置: -Xms:设置在JVM启动时的堆内存初始大小; -Xmx:设置堆区允许的最大内存 如果堆区内存超过-Xmx设置大小,则抛出OutOfMemoryError异常。...七、直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规 范中定义的内存区域。...服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略 直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制), 从而导致动态扩展时出现OutOfMemoryError
JVM内存区域 数据区域 ?...此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError内存溢出情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。...为对象分配空间的任务等同于把一块确定大小的内存从堆中划分出来 指针碰撞:假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离...,并更新列表上的记录,这种分配方式称为“空闲列表”; 并发创建对象(非线程安全) 方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性 方案
前一段时间写过一篇关于 JVM虚拟机之类加载的过程 的文章,其中讲述了Java虚拟机对类的处理。...最近听了一次部门内部有关JVM的分享,自己也顺便回顾了之前阅读《深入理解JVM虚拟机》一书中所讲述的Java虚拟机对内存的管理,再次将自己理解的JVM内存模型分享给大家。...Java运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区。...JVM内存模型 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 ? java-memory-model 程序计数器 当前线程所执行的字节码文件的行号指示器。...及之后版本的JVM已经将运行时常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行时常量池。
无论底层操作系统/硬件是大端还是小端,每个 JVM 都以大端顺序(高字节在前)存储和使用内存中的数据。 注意:有时,JVM 实现的行为与另一个不同,但通常是相同的。...桌面/服务器 (x86) 处理器和以前的 android 虚拟机 Dalvik 使用这种基于寄存器的架构。 字节码 由于 JVM 解释字节码,因此在深入之前了解它是有用的。...换句话说,当一个类、方法或字段被引用时,JVM 通过运行时常量池在内存中搜索实际地址。它还包含常量值,如字符串文字或常量原语。...框架在其方法调用完成时被销毁,无论该完成是正常的还是突然的(它会引发未捕获的异常)。 只有一帧,即执行方法的帧,在给定线程的任何点都处于活动状态。该帧称为当前帧,其方法称为当前方法。...关于JVM内存模型,你学废了么?
# JVM JDK版本:1.8 # 1、JVM内存区域 JVM在执行应用程序的过程中会将它管理的内存分为若干个不同的区域。其中一部分是线程私有的,一部分是线程共享的。...Java内存区域也叫做运行时数据区。JVM内存内存结果如下图所示: ---- # 2、Java代码执行流程 Java源码文件通过Java编译器生成字节码文件。...# 4.3、虚拟机的退出 虚拟机退出有如下几种情况: 1、程序正常执行完毕结束。 2、程序在执行过程中遇到了异常或错误而终止。 3、由于操作系统错误而导致Java虚拟机进程终止。...---- # 5、JVM内存架构 方法区:存放常量信息,类信息,方法信息。 LV(Local Variables):局部变量表。 OS(Operand Stack):操作数栈。...JVM的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。
物理内存是真实存在的,例如:内存条 虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘被称作交换空间。虚拟内存保证多个线程同时执行时可以共享同一块物理内存。...如果不进行划分,就会造成数据混乱,影响系统的正常运行。分开存放保证了操作系统和用户进程之间互不影响,保证系统的稳定性,同时也便于管理。...三:内部溢出和内存泄漏 内部溢出:程序再申请内存时,如果没有足够的内存空间,就会抛出out of memory 内存泄漏: 应该被垃圾回收的对象,却没有被回收,导致内存空间被浪费...内存泄漏可能导致内存溢出。 ...检查代码,找出可能发生内存溢出的代码,就行修改 四:JVM内存分配策略 静态内存分布:在编译时就可以确定对象需要的空间大小,在编译的过程中就一次性分配内存空间, 堆内存分布
领取专属 10元无门槛券
手把手带您无忧上云