当前位置: 首页 > news >正文

网站建设不包括哪个阶段蛋糕店微网站

网站建设不包括哪个阶段,蛋糕店微网站,重庆市建筑工程网,南京网站微信建设文章目录 #x1f31f; Java虚拟机内存模型#x1f34a; 一、方法区#x1f34a; 二、堆#x1f389; 堆的基本概念#x1f389; 堆的结构#x1f4dd; 新生代#x1f4dd; 老年代 #x1f389; 堆的分配策略#x1f4dd; 对象优先分配#x1f4dd; 空间优先分配 Java虚拟机内存模型 一、方法区 二、堆 堆的基本概念 堆的结构 新生代 老年代 堆的分配策略 对象优先分配 空间优先分配 堆的性能调优 三、Java虚拟机栈 栈帧的创建过程 局部变量表 操作数栈 动态链接 方法出口 线程信息 栈帧的销毁过程 四、本地方法栈 五、程序计数器 我是廖志伟一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。跑过十五公里、徒步爬过衡山、有过三个月减肥20斤的经历、是个喜欢躺平的狠人。 拥有多年一线研发和团队管理经验研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper)消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。有从0到1的高并发项目经验利用弹性伸缩、负载均衡、报警任务、自启动脚本最高压测过200台机器有着丰富的项目调优经验。 经过多年在CSDN创作上千篇文章的经验积累我已经拥有了不错的写作技巧。同时我还与清华大学出版社签下了四本书籍的合约并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的《Java项目实战—深入理解大型互联网企业通用技术》以及《解密程序员的思维密码–沟通、演讲、思考的实践》。具体出版计划会根据实际情况进行调整希望各位读者朋友能够多多支持 希望各位读者大大多多支持用心写文章的博主现在时代变了信息爆炸酒香也怕巷子深博主真的需要大家的帮助才能在这片海洋中继续发光发热所以赶紧动动你的小手点波关注❤️点波赞点波收藏⭐甚至点波评论✍️都是对博主最好的支持和鼓励 博客主页 我是廖志伟开源项目java_wxid 哔哩哔哩我是廖志伟个人社区幕后大佬个人微信号 SeniorRD 在这个美好的时刻本人不再啰嗦废话现在毫不拖延地进入文章所要讨论的主题。接下来我将为大家呈现正文内容。 Java虚拟机内存模型 Java虚拟机JVM是一种能够在不同平台上运行Java程序的虚拟机。JVM内部有一个内存模型用于管理其内部的内存分配。JVM内存模型可以分为以下五个部分 一、方法区 方法区也被称为永久代Permanent Generation是Java虚拟机用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的区域。它是虚拟机规范中的一部分属于非堆内存。在JDK1.8之前方法区是使用永久代实现的而JDK1.8之后则使用元空间Metaspace来代替永久代将方法区移到了本地内存中。 在Java虚拟机中有一种名为“即时编译器”的技术它可以将Java字节码转换为本地机器代码并将这些代码存储在方法区中。一些框架如Spring、MyBatis等需要进行反射等操作这些操作会用到通过类加载器加载的类信息和一些常量而这些信息会存储在方法区中。 方法区中存储的数据包括 已加载类的类型信息包括类的元数据如类的访问修饰符、父类、实现的接口、字段、方法等和类的静态变量。常量池Constant Pool常量池是类加载后存储在方法区的一段内存空间用于存储编译器生成的各种字面量和符号引用。即时编译器编译后的字节码将Java字节码转换为本地机器代码并将这些代码存储在方法区中。字符串常量池存储Java字符串常量。 由于方法区存储的是不可变的数据容易出现内存泄漏的情况。特别是在使用自定义类加载器时如果频繁进行类的加载和卸载操作就有可能导致方法区中的数据越来越多最终导致内存泄漏。 在JDK1.8之前方法区使用永久代实现其大小是固定的且无法回收的因此容易导致过度内存占用。即使在JDK1.8之后方法区使用元空间代替永久代但在默认情况下元空间也是没有大小限制的因此仍可能导致过度内存占用。 由于方法区存储的数据通常都是不可变的因此垃圾回收器在进行垃圾回收时需要扫描大量的无用数据导致GC效率低下。 为了避免方法区带来的问题可以采取以下优化手段 设置方法区最大值可以通过JVM启动参数来进行控制方法区的大小包括最小值、最大值、初始值。当方法区达到最大值时JVM会发生OOMOut Of Memory错误。 使用内存泄漏检测工具在使用自定义类加载器时可以采用内存泄漏检测工具来检测是否存在内存泄漏问题。 对不需要的类进行卸载在加载某个类时可以根据需要选择是否卸载该类。当某个类不再被需要时可以手动将其卸载从而避免方法区中的数据越来越多导致过度内存占用和GC效率低下。 调整元空间大小在JDK1.8之后可以使用元空间代替永久代将方法区移到了本地内存中。可以通过JVM启动参数来控制元空间的大小从而避免过度内存占用。 使用弱引用在使用动态语言和代码生成技术时可以使用弱引用来避免内存泄漏问题。当某个对象不再被使用时弱引用会自动将其清除。 二、堆 堆的基本概念 堆是Java虚拟机运行时数据区之一用于存储对象实例。堆是在JVM启动时创建并且在JVM关闭时才会被销毁堆的大小可以通过-Xmx参数控制。堆的大小不足会导致OutOfMemoryError而堆的过大会导致GC时间过长影响程序的实际性能。 堆的结构 堆由不同的区域构成新生代、老年代。新生代由Eden区和Survivor0区、Survivor1区组成。 新生代 新生代是堆的一部分用于存放新创建的对象。新生代中的对象生命周期短暂一般很快就会被回收掉。新生代分为Eden区和Survivor0区、Survivor1区。其中Eden区用于存放新创建的对象Survivor0区和Survivor1区用于存放经过一次Minor GC后仍然存活的对象。一块Eden区和两块Survivor区比例是811。 在新生代每个对象都有一个年龄计数器。当对象在Eden区中被创建时年龄计数器初始化为0每经过一次Minor GC年龄计数器的值就会加1。当年龄计数器的值达到一定阈值时对象将会被晋升到老年代中。晋升到老年代中的对象将会在进行Full GC时被回收。 老年代 老年代是堆的一部分用于存放存活时间较长的对象。老年代中的对象生命周期较长一般不会被频繁回收。老年代中的对象在进行Full GC时才会被回收。 堆的分配策略 堆的分配策略包括两种对象优先分配和空间优先分配。 对象优先分配 对象优先分配是JVM默认的分配策略它将新创建的对象分配到Eden区中如果Eden区空间不足就会触发Minor GC。在Minor GC时经过垃圾回收后如果对象还存活就会被移动到Survivor0区或Survivor1区中如果Survivor0区或Survivor1区空间不足就会触发Minor GC。当对象在Survivor0区或Survivor1区中经过一定次数的垃圾回收后仍然存活就会被晋升到老年代中。 空间优先分配 空间优先分配是指JVM将新创建的对象分配到空间使用率较低的区域中。通常情况下空间使用率较低的区域是老年代。在空间使用率较低的情况下空间优先分配策略可以减少垃圾回收的次数从而提高程序的性能。 堆的性能调优 堆的性能调优是Java程序优化的重要部分主要包括以下几个方面 堆的大小调优堆的大小直接影响程序的性能需要根据实际情况对堆的大小进行调优。新生代和老年代的分配比例新生代和老年代的分配比例也影响程序的性能通常情况下新生代占总堆大小的1/3到1/4比较合适。垃圾回收算法的选择垃圾回收算法的选择也影响程序的性能需要根据实际情况选择合适的垃圾回收算法。 总的来说堆是Java虚拟机运行时数据区之一用于存储对象实例。堆的大小和分配策略对程序的性能有着至关重要的影响。因此需要根据实际情况对堆进行性能调优以提高程序的效率和性能。 三、Java虚拟机栈 栈帧是Java虚拟机执行Java程序的基本单元。在Java程序中每个方法被调用时都会为该方法创建一个栈帧。栈帧包括了局部变量表、操作数栈、动态链接、方法出口和线程信息等。当方法执行完成时栈帧会被销毁。Java虚拟机通过栈帧的入栈和出栈来管理Java程序的方法调用过程。在栈帧的执行过程中Java虚拟机可以实现动态查找和链接从而实现了Java程序的跨平台执行。 栈帧的创建过程 当Java程序调用一个方法时虚拟机会根据方法的描述信息为该方法创建一个栈帧。栈帧包括了局部变量表、操作数栈、动态链接、方法出口等信息。Java虚拟机栈将该栈帧入栈使得该栈帧成为当前栈帧。从而被调用方法开始执行。 局部变量表 局部变量表是用于存放方法参数和局部变量的。在栈帧被创建的时候局部变量表就会被分配空间。局部变量表的大小在编译期间就已经确定了但是其所需的大小在运行时才能确定。因此在方法运行之前Java虚拟机需要根据局部变量表的大小来分配栈帧所需的内存空间。局部变量表所需的内存空间取决于方法所需的局部变量的数量。 操作数栈 操作数栈是一个后进先出的栈用于存放方法所有的中间结果。它是栈帧的一个重要组成部分在方法执行过程中任何操作都必须通过操作数栈来完成。当方法被调用时操作数栈是空的。在方法执行过程中操作数栈中的元素会因为方法中的操作而被推入或弹出。当方法执行完成时操作数栈被清除而栈帧也随之出栈。 动态链接 动态链接是在编译期无法确定的方法调用跳转。在Java虚拟机中每个栈帧都有一个指向它所属的类的指针称为类指针(Class Pointer)。在Java虚拟机中方法的调用通常是通过一个符号引用来实现的。符号引用包括了方法的名字、返回值类型和参数列表的描述符。当Java虚拟机遇到一个符号引用时它会通过该符号引用查找对应的方法。这个查找过程就称为动态链接。这种动态查找和链接的方式是Java虚拟机实现跨平台的一种技术手段。如果在查找过程中发现方法没有找到虚拟机会抛出NoSuchMethodError错误。 方法出口 方法出口是一个指向方法调用者的返回地址的指针。当一个方法被调用时方法出口会被压入操作数栈中。当方法执行完成时该方法的返回值会被压入操作数栈中返回地址也会从栈中弹出到程序计数器(PC)中使程序继续执行。 线程信息 Java程序中的线程是轻量级的执行单元。Java虚拟机会为每个线程分配一个Java虚拟机栈每个栈由多个栈帧组成。每个线程在运行时都有一个栈帧作为当前栈帧。每个栈帧包括了线程所需的局部变量表、操作数栈、动态链接、方法出口和线程信息等。线程信息包括了线程的ID、线程名、线程状态等信息。 栈帧的销毁过程 栈帧的销毁是指栈帧从虚拟机中出栈的过程。当方法执行完成时Java虚拟机会将该方法的栈帧出栈并将方法的返回值压入方法调用者的操作数栈中。当方法调用者继续执行时它会弹出被调用方法的返回值。这个过程就完成了栈帧的销毁。 四、本地方法栈 本地方法栈是Java虚拟机中的一个重要组成部分是Java程序中调用的本地方法所使用的内存区域也是线程私有的。在Java虚拟机栈中栈帧保存的是Java方法的状态而在本地方法栈中栈帧保存的是本地方法Native Method的状态。本地方法是Java程序中调用本地库Native Library的接口也就是通过JNIJava Native Interface调用外部的C/C等本地代码在这种情况下Java虚拟机就需要提供一片内存区域来支持本地方法的执行。 本地方法栈的空间大小也是可以通过JVM启动参数来控制的参数为-Xss。默认情况下64位JVM的本地方法栈大小为1MB32位JVM的本地方法栈大小为320KB。当本地方法栈空间不足时会发生StackOverflowError当本地方法栈空间无法继续扩展时会发生OutOfMemoryError。 本地方法栈与Java虚拟机栈的区别在于Java虚拟机栈保存的是Java方法的状态而本地方法栈保存的是本地方法的状态。另外Java虚拟机栈是由JVM自动管理的包括分配和释放而本地方法栈则是由本地方法本身负责管理的。在调用本地方法之前JVM需要将本地方法的参数传递给本地方法参数传递的方式和C语言类似有寄存器传递和栈传递两种方式。当本地方法执行完毕后JVM需要将本地方法的返回值传递回Java程序中返回值传递的方式同样有寄存器传递和栈传递两种方式。 本地方法栈的创建和销毁与方法调用的进入和返回有关在Java程序调用本地方法时JVM会检查是否已经加载了本地方法所在的本地库并确保本地库已经正确地链接到JVM中。然后JVM会创建一个新的本地方法栈并将本地方法的参数复制到本地方法栈中本地方法开始执行。当本地方法执行完毕并返回时JVM会将返回值复制回到Java程序中然后销毁本地方法栈继续执行Java程序中的其他代码。 本地方法栈在Java程序中的使用相对较少通常是在需要调用本地库的情况下才使用本地方法栈。如果本地方法栈的空间不足可以通过增加JVM的栈空间来解决。但是在实际开发中我们应该尽量避免使用本地方法因为本地方法容易引起内存泄漏和安全问题同时本地方法的跨平台性也比较差。 五、程序计数器 程序计数器是JVM中的一块较小内存区域主要用于记录当前线程运行的字节码指令地址也就是下一条要执行的指令在代码中的位置。JVM中所有线程都有一个独立的程序计数器它是线程私有的不会被其他线程访问。 程序计数器的作用是在多线程环境下保证线程切换后能恢复到正确的执行位置。当线程被中断或被抢占时程序计数器记录了断点的位置下次恢复时就可以从这个位置继续执行。线程执行Java代码时程序计数器记录的是当前执行的字节码行数。 除了恢复现场程序计数器还有一个作用就是支持代码的解释执行。字节码解释器按照程序计数器中的地址从方法字节码中依次获取指令并执行。如果执行的是Java方法则程序计数器记录的是该线程当前执行的Java方法地址如果执行的是本地方法则程序计数器记录的是undefined。 当线程调用了本地方法时程序计数器保存的是undefined当返回到Java方法时程序计数器会恢复到该方法的指令地址。Java虚拟机规范要求程序计数器是线程私有的每个线程独立维护。这种设计方案在一定程度上简化了线程上下文切换的操作。 程序计数器的大小是固定的不会发生OOM错误。对于32位JVM来说程序计数器的最大值是2的32次方也就是4GB。对于64位JVM来说程序计数器的最大值是2的64次方也就是18EB(Exabytes)完全无需考虑OOM的问题。 程序计数器是JVM中非常重要的一个概念它是实现Java虚拟机线程安全的关键所在。虽然它的作用看起来比较简单但是却不可少。程序计数器负责记录线程下一条执行的指令遇到中断或者线程切换时能够恢复到正确的执行位置从而保证线程的正确性和安全性。 如果您需要转载或者搬运这篇文章的话非常欢迎您私信我哦~ 希望各位读者大大多多支持用心写文章的博主现在时代变了信息爆炸酒香也怕巷子深博主真的需要大家的帮助才能在这片海洋中继续发光发热所以赶紧动动你的小手点波关注❤️点波赞点波收藏⭐甚至点波评论✍️都是对博主最好的支持和鼓励 博客主页 我是廖志伟开源项目java_wxid 哔哩哔哩我是廖志伟个人社区幕后大佬个人微信号 SeniorRD 博主的人生感悟和目标 程序开发这条路不能停停下来容易被淘汰掉吃不了自律的苦就要受平庸的罪持续的能力才能带来持续的自信。我本身是一个很普通程序员放在人堆里除了与生俱来的盛世美颜就剩180的大高个了就是我这样的一个人默默写博文也有好多年了。有句老话说的好牛逼之前都是傻逼式的坚持希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机可以打造属于自己的技术影响力。内心起伏不定我时而激动时而沉思。我希望自己能成为一个综合性人才具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师团队的指挥者技术团队的中流砥柱企业战略和资本规划的实战专家。这个目标的实现需要不懈的努力和持续的成长但我必须努力追求。因为我知道只有成为这样的人才我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代我必须随时准备好迎接挑战不断学习和探索新的领域才能不断地向前推进。我坚信只要我不断努力我一定会达到自己的目标。
http://www.ho-use.cn/article/10822417.html

相关文章:

  • 中企动力做网站 知乎前端培训机构
  • 拥有域名后怎么建设网站使用aspx做电影网站
  • 网站登录系统内部错误北京优化公司司
  • 网站建设方案策划书ppt模板网站gif横幅广告怎么做
  • 罗村建网站游戏类网页设计
  • 北京网站建设正邦国家工业和信息化部网站备案系统
  • 大型门户网站开发信息流优化师简历
  • 睢宁网站制作合肥网络推广策划方案
  • 网站建设方案百度云搜索引擎入口盘搜搜
  • 遵义北京网站建设庆安建设局网站
  • 专业北京网站建设wordpress去掉google
  • 广州花都网站开发wordpress七牛视频教程
  • 好的h5制作网站模板下载茂南网站建设公司
  • 八旬老太做直播 什么网站品牌策划是做什么的
  • 免费做网站模板在哪里做福田深圳网站建设
  • 福建网站开发wordpress英文版切换中文
  • 小说网站开发l河北省住房城乡建设厅网站首页
  • 荥阳市建设局 网站机械设备东莞网站建设
  • 做图表网站河源做网站优化
  • 文登建设局网站建筑考试培训网
  • 网站开发国外研究状况做设计比较好的网站推荐
  • 有网络网站打不开怎么回事wordpress菜单跳转页面跳转
  • 全球最好的黄页网站app 网站开发
  • 建筑网站设计大全网络营销网站源码
  • 线上海报设计网站番禺区保安服务公司
  • 大连网站制作哪家最好学生个人网页设计主题
  • 网站到期续费通知江门论坛建站模板
  • 北京建设工程质量总站网站如何做贷款网站推广
  • 黑群晖建设个人网站深圳2024新冠最新情况
  • php做数据网站网业端云服务