首页 文章 精选 留言 我的

精选列表

搜索[优化],共10000篇文章
优秀的个人博客,低调大师

Android内存优化2 了解java内存分配 2

JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。 下面对这五个区域展开深入的介绍。 1. 程序计数器 1.1. 什么是程序计数器? 程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码指令的地址。注:但是,如果当前线程正在执行的是一个本地方法,那么此时程序计数器为空。 1.2. 程序计数器的作用 程序计数器有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 1.3. 程序计数器的特点 是一块较小的存储空间 线程私有。每条线程都有一个程序计数器。 是唯一一个不会出现OutOfMemoryError的内存区域。 生命周期随着线程的创建而创建,随着线程的结束而死亡。 2. Java虚拟机栈(JVM Stack) 2.1. 什么是Java虚拟机栈? Java虚拟机栈是描述Java方法运行过程的内存模型。 Java虚拟机栈会为每一个即将运行的Java方法创建一块叫做“栈帧”的区域,这块区域用于存储该方法在运行过程中所需要的一些信息,这些信息包括: 局部变量表 存放基本数据类型变量、引用类型的变量、returnAddress类型的变量。 操作数栈 动态链接 方法出口信息 等 当一个方法即将被运行时,Java虚拟机栈首先会在Java虚拟机栈中为该方法创建一块“栈帧”,栈帧中包含局部变量表、操作数栈、动态链接、方法出口信息等。当方法在运行过程中需要创建局部变量时,就将局部变量的值存入栈帧的局部变量表中。 当这个方法执行完毕后,这个方法所对应的栈帧将会出栈,并释放内存空间。 注意:人们常说,Java的内存空间分为“栈”和“堆”,栈中存放局部变量,堆中存放对象。 这句话不完全正确!这里的“堆”可以这么理解,但这里的“栈”只代表了Java虚拟机栈中的局部变量表部分。真正的Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。 2.2. Java虚拟机栈的特点 局部变量表的创建是在方法被执行的时候,随着栈帧的创建而创建。而且,局部变量表的大小在编译时期就确定下来了,在创建的时候只需分配事先规定好的大小即可。此外,在方法运行的过程中局部变量表的大小是不会发生改变的。 Java虚拟机栈会出现两种异常:StackOverFlowError和OutOfMemoryError。 a) StackOverFlowError: 若Java虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就抛出StackOverFlowError异常。 b) OutOfMemoryError: 若Java虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完了,无法再动态扩展了,此时抛出OutOfMemoryError异常。 Java虚拟机栈也是线程私有的,每个线程都有各自的Java虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。 注:StackOverFlowError和OutOfMemoryError的异同? StackOverFlowError表示当前线程申请的栈超过了事先定好的栈的最大深度,但内存空间可能还有很多。 而OutOfMemoryError是指当线程申请栈时发现栈已经满了,而且内存也全都用光了。 3. 本地方法栈 3.1. 什么是本地方法栈? 本地方法栈和Java虚拟机栈实现的功能类似,只不过本地方法区是本地方法运行的内存模型。 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。 方法执行完毕后相应的栈帧也会出栈并释放内存空间。 也会抛出StackOverFlowError和OutOfMemoryError异常。 4. 堆 4.1. 什么是堆? 堆是用来存放对象的内存空间。几乎所有的对象都存储在堆中。 4.2. 堆的特点 线程共享 整个Java虚拟机只有一个堆,所有的线程都访问同一个堆。而程序计数器、Java虚拟机栈、本地方法栈都是一个线程对应一个的。 在虚拟机启动时创建 垃圾回收的主要场所。 可以进一步细分为:新生代、老年代。 新生代又可被分为:Eden、From Survior、To Survior。 不同的区域存放具有不同生命周期的对象。这样可以根据不同的区域使用不同的垃圾回收算法,从而更具有针对性,从而更高效。 堆的大小既可以固定也可以扩展,但主流的虚拟机堆的大小是可扩展的,因此当线程请求分配内存,但堆已满,且内存已满无法再扩展时,就抛出OutOfMemoryError。 5. 方法区 5.1. 什么是方法区? Java虚拟机规范中定义方法区是堆的一个逻辑部分。 方法区中存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。 5.2. 方法区的特点 线程共享 方法区是堆的一个逻辑部分,因此和堆一样,都是线程共享的。整个虚拟机中只有一个方法区。 永久代 方法区中的信息一般需要长期存在,而且它又是堆的逻辑分区,因此用堆的划分方法,我们把方法区称为老年代。 内存回收效率低 方法区中的信息一般需要长期存在,回收一遍内存之后可能只有少量信息无效。 对方法区的内存回收的主要目标是:对常量池的回收 和 对类型的卸载。 Java虚拟机规范对方法区的要求比较宽松。 和堆一样,允许固定大小,也允许可扩展的大小,还允许不实现垃圾回收。 5.3. 什么是运行时常量池? 方法区中存放三种数据:类信息、常量、静态变量、即时编译器编译后的代码。其中常量存储在运行时常量池中。 我们一般在一个类中通过public static final来声明一个常量。这个类被编译后便生成Class文件,这个类的所有信息都存储在这个class文件中。 当这个类被Java虚拟机加载后,class文件中的常量就存放在方法区的运行时常量池中。而且在运行期间,可以向常量池中添加新的常量。如:String类的intern()方法就能在运行期间向常量池中添加字符串常量。 当运行时常量池中的某些常量没有被对象引用,同时也没有被变量引用,那么就需要垃圾收集器回收。 6. 直接内存 直接内存是除Java虚拟机之外的内存,但也有可能被Java使用。 在NIO中引入了一种基于通道和缓冲的IO方式。它可以通过调用本地方法直接分配Java虚拟机之外的内存,然后通过一个存储在Java堆中的DirectByteBuffer对象直接操作该内存,而无需先将外面内存中的数据复制到堆中再操作,从而提升了数据操作的效率。 直接内存的大小不受Java虚拟机控制,但既然是内存,当内存不足时就会抛出OOM异常。 综上所述 Java虚拟机的内存模型中一共有两个“栈”,分别是:Java虚拟机栈和本地方法栈。 两个“栈”的功能类似,都是方法运行过程的内存模型。并且两个“栈”内部构造相同,都是线程私有。 只不过Java虚拟机栈描述的是Java方法运行过程的内存模型,而本地方法栈是描述Java本地方法运行过程的内存模型。 Java虚拟机的内存模型中一共有两个“堆”,一个是原本的堆,一个是方法区。方法区本质上是属于堆的一个逻辑部分。堆中存放对象,方法区中存放类信息、常量、静态变量、即时编译器编译的代码。 堆是Java虚拟机中最大的一块内存区域,也是垃圾收集器主要的工作区域。 程序计数器、Java虚拟机栈、本地方法栈是线程私有的,即每个线程都拥有各自的程序计数器、Java虚拟机栈、本地方法区。并且他们的生命周期和所属的线程一样。 而堆、方法区是线程共享的,在Java虚拟机中只有一个堆、一个方法栈。并在JVM启动的时候就创建,JVM停止才销毁。 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/8469847.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

利用SDN&NFV优化数据中心

SDN和NFV正影响着IT、数据中心和电信的融合。这些技术不仅可以给管理基础设施IT数据中心提供新的机遇,而且随着网络的可编程性,NFV和SDN也让企业数据中心实现更大的弹性灵活度,并给数据中心管理人员更强的灵活性和可扩展性来预期改变市场需求和保持客户期望的领先地位。 软件定义网络新方法 Gartner已 经定义软件定义网络SDN作为“一种新的方法来设计、编译和操作网络,旨在专注于提供业务的敏捷性,同时降低资本和运营成本”。该公司透露,到2017 年,将有10%的客户应用设备进行网络虚拟化。除此以外,根据行业分析师预测,在未来五年内,更多的网络流量将被虚拟化。 网络功能虚拟化(NFV)是一种利用网络IT虚拟化技术来虚拟网络节点功能(如Firewall、router、IDS入侵检测系统等)的整个类进入到被连接或链接的编译块中来创建通信服务。NFV目的是使用计算虚拟化和可用存储方案减少依赖性和相关硬件的限制。 随着企业正在从内部数据中心转变到主机托管设备服务,不同于传统IT基础架构元素,从物理服务器逐步演进到虚拟化、软件定义架构、云服务。DCD智 能预测,2014到2020年间,在企业内部服务器托管IT基础设施的增长率限制在大约1.29%的CAGR(年均复合增长率)。对于托管、外包和共享设 施空间,在相同期间,增长率预计在9%的CAGR,全部的数据中心空间在全球范围内将从36百万平方米增长到46百万平方米,但内部空间不足够使用,这一 趋势表明需要增加虚拟化技术和云外部和内部部署服务来减少空间的使用。 业内人士观点 作为数据中心特别是DCIM解决方案企业软件供应商,他们正看到SDN和NFV的出现,特别是为客户打造新的数据中心或整合现有基础设施成为替代性设施,在大的电信供应商中,对实施SDN和NFV技术也有极大的兴趣。 现有的异构内部数据中心中,很多都还没有应用SDN技术。但是,这只是初期的,因为大多数数据中心仍然通过在筒仓管理,意味着每个团队负责不同的服 务以及相应的IT基础设施来支持它,会造成不同筒仓间的差异带来更多的复杂性和挑战性,这也将促进SDN和NFV的发展。一个团队通常负责IT堆栈,另一 个负责管理网络,为了实现SDN和NFV技术,这些所属组织的分界及标准必须统一,为了提供所有IT资产和资源集中的访问和控制。 随着数据中心的扩展,且为了与不断增长的需求保持同步,本身挑战在于技术部署过程。现今并发部署方案已经存在,即一部分数据中心在SDN模式下工 作,其余部分仍使用旧的技术进行操作,数据中心管理者需要明确透明的观点理论应用到现有的物理基础设施,且其他部分需要直接链接到虚拟化资产和技术领域 中,这将会导致形成一个困难的过渡阶段。 为了实现自动化服务,维护服务质量和管理数据中心需要向虚拟化基础设施转变的能力,有必要对现有可用物理基础设施进行所有的详细数据统计,对其进行分析,SDN和NFV技术将为数据中心和互联网提供巨大益处。 SDN和NFV可以增加灵活性和服务交付的敏捷性,缩短对市场推出的时间,有助于自动完成很多任务,并提供需要的网络能力,数据中心将更加有效的工作并能够启动服务阵列,推动数据中心的发展。 作者:SDNLAB 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册