热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

b+树的原理

Java内存区域Heap线程公有存放实例对象是GC主要管理区域,因此可以更细致的划分为:新生代、老年代再细致一点划分:Eden区、FromSurvivo

Java 内存区域
技术分享图片
Heap
线程公有
存放实例对象
是GC主要管理区域,因此可以更细致的划分为:新生代、老年代
再细致一点划分:Eden区、From Survivor区、To Survivor区
内存空间:可以物理上不连续、逻辑上连续即可。
Method Area
线程公有
主要存储:类信息、常量、静态变量、编译后的代码
运行时常量池
主要存储:编译期的字面量以及符号引用
具有动态性,即可以在运行时将常量放入池中。
VM Stack
线程私有
主要包括:
局部变量表:存放编译期的各种基本数据类型、对象引用、returnAddress类型
操作数栈:每一个元素可以为任意的java类型,32位数据类型所占容量为1,64位数据类型所占容量为2
动态连接:class文件的常量池中有大量的符号引用,这些符号引用有一部分是在类加载阶段或者在第一次使用的时候就转换为直接引用,这部分成为静态解析。另一部分是每一次运行的时候转化为直接引用,这部分即为动态连接。
方法出口:例如A方法中调用了B方法,B方法的返回值压入A方法的栈帧中。
Native Method Stack
线程私有
与VM Stack相似,唯一区别在于该栈为Native方法服务。
Hot Spot 将VM Stack 与 Native Method Stack 合而为一。
Program Counter Register
线程私有
用于记录线程执行字节码的指令的地址。
Direct Memory
NIO中使用直接内存,提高效率。
对象创建过程
技术分享图片



  • 首先当虚拟机遇到一条new指令时,先去检查该符号引用代表的类是否已经完成类加载,若未完成,则执行以下步骤

  • 类加载

  • 为对象分配内存
    分配方式:指针碰撞/空闲列表
    线程安全:CAS解决

  • 虚拟机初始化内存空间

  • 虚拟机对对象进行必要的设置

  • 执行完成初始化

  • 对象创建完成


对象内存布局技术分享图片
第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对象分代年龄,这部分信息称为“Mark Word”;Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据自己的状态复用自己的存储空间。
第二部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;
如果对象是一个 Java 数组,那在对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通 Java 对象的元数据信息确定 Java 对象的大小,但是从数组的元数据中无法确定数组的大小。
在 32 位系统下,存放 Class 指针的空间大小是 4 字节,Mark Word 空间大小也是4字节,因此头部就是 8 字节,如果是数组就需要再加 4 字节表示数组的长度,如下表所示:
技术分享图片
在 64 位系统及 64 位 JVM 下,开启指针压缩,那么头部存放 Class 指针的空间大小还是4字节,而 Mark Word 区域会变大,变成 8 字节,也就是头部最少为 12 字节,如下表所示:

技术分享图片
压缩指针:开启指针压缩使用算法开销带来内存节约,Java 对象都是以 8 字节对齐的,也就是以 8 字节为内存访问的基本单元,那么在地理处理上,就有 3 个位是空闲的,这 3 个位可以用来虚拟,利用 32 位的地址指针原本最多只能寻址 4GB,但是加上 3 个位的 8 种内部运算,就可以变化出 32GB 的寻址。

对象访问定位
两种方式:

句柄池:引用中存储的是句柄地址,当实例对象移动时,只需要改变句柄对应的指针,不需要改变引用本身,比较稳定。
直接指针:速度快,节省了一次指针定位的开销。
常用指令
invokeinterface:用以调用接口方法,在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokevirtual:指令用于调用对象的实例方法,根据对象的实际类型进行分派
invokestatic:用以调用类方法
invokespecial:指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。
invokedynamic:JDK1.7新加入的一个虚拟机指令,相比于之前的四条指令,他们的分派逻辑都是固化在JVM内部,而invokedynamic则用于处理新的方法分派:它允许应用级别的代码来确定执行哪一个方法调用,只有在调用要执行的时候,才会进行这种判断,从而达到动态语言的支持。
基于栈的指令集 && 基于寄存器的指令集
java采用的是基于栈的指令集,这种指令集依赖操作数栈进行工作

优点:

可移植:由于寄存器是由硬件直接提供的,所以程序如果依赖寄存器不可避免的会受到硬件的约束
程序代码紧凑
编译器实现简单
缺点:
速度慢
指令数量多:完成相同功能所需的指令比寄存器架构多,因为光是入栈、出栈就已经很多指令了
内存访问多:频繁的栈访问意味着频繁的内存访问,而对于处理器来说,内存始终是速度的瓶颈。
Java内存溢出异常
内存溢出
堆上无内存可完成实例分配且堆无法扩展时:java.lang.OutOfMemoryError: Java heap space
方法区以及内存的常量池无法满足内存分配需求时:java.lang.OutOfMemoryError: PermGen space
栈扩展时无法申请足够内存:java.lang.StackOverflowError
内存泄漏
代码设计引起的程序动态分配的内存没有释放,导致该部分内存不可用
内存溢出与内存泄漏的区别
内存泄漏是导致内存溢出的原因之一,内存泄漏积累起来就会导致内存溢出
内存泄漏可以通过完善代码来解决,内存溢出无法彻底避免,只能通过配置来减少发生的频率
内存泄漏内存溢出的检查
性能监测工具:

JProfiler
Optimizeit Profiler
Eclipse Memory Analyzer
EclipseMAT
JProbe

更多java学习资料可关注:itheimaGZ获取


推荐阅读
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文介绍了如何使用 CMD 批处理脚本进行文件操作,包括将指定目录下的 PHP 文件重命名为 HTML 文件,并将这些文件复制到另一个目录。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 两个条件,组合控制#if($query_string~*modviewthread&t(&extra(.*)))?$)#{#set$itid$1;#rewrite^ ... [详细]
  • 解决Win10下MySQL连接问题:Navicat 2003无法连接到本地MySQL服务器(10061)
    本文介绍如何在Windows 10环境下解决Navicat 2003无法连接到本地MySQL服务器的问题,包括启动MySQL服务和检查配置文件的方法。 ... [详细]
  • 在 Mac 上查看隐藏文件和文件夹的详细指南。通过终端命令,您可以轻松地显示或隐藏这些文件。具体步骤如下:输入 `defaults write com.apple.finder AppleShowAllFiles -bool true` 以显示所有隐藏文件,或使用 `defaults write com.apple.finder AppleShowAllFiles -bool false` 以重新隐藏它们。此方法适用于各种版本的 macOS,帮助用户更好地管理和访问系统文件。 ... [详细]
  • 本文详细解析了逻辑运算符“与”(&&)和“或”(||)在编程中的应用。通过具体示例,如 `[dehua@teacher~]$[$(id -u) -eq 0] && echo "You are root" || echo "You must be root"`,展示了如何利用这些运算符进行条件判断和命令执行。此外,文章还探讨了这些运算符在不同编程语言中的实现和最佳实践,帮助读者更好地理解和运用逻辑运算符。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践
    蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践 ... [详细]
  • 在最近的项目中,我们广泛使用了Qt框架的网络库,过程中遇到了一些挑战和问题。本文旨在记录这些经验和解决方案,以便日后参考。鉴于我们的客户端GUI完全基于Qt开发,我们期望利用其强大的网络功能进行Fiddler网络数据包的捕获与分析,以提升开发效率和应用性能。 ... [详细]
author-avatar
空瓶子姑娘_537
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有