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

网站建设公司运营百家号优化

网站建设公司运营,百家号优化,网站开发app,wordpress手机导航栏设置内存区域划分 对于大多数的程序员来说#xff0c;Java 内存比较流行的说法便是堆和栈#xff0c;这其实是非常粗略的一种划分#xff0c;这种划分的“堆”对应内存模型的 Java 堆#xff0c;“栈”是指虚拟机栈#xff0c;然而 Java 内存模型远比这更复杂#xff0c;想深… 内存区域划分 对于大多数的程序员来说Java 内存比较流行的说法便是堆和栈这其实是非常粗略的一种划分这种划分的“堆”对应内存模型的 Java 堆“栈”是指虚拟机栈然而 Java 内存模型远比这更复杂想深入了解 Java 的内存还是有必要明白整个内存区域分。 了解 Java GC 机制必须先清楚在 JVM 中内存区域的划分。 在 Java 运行时的数据区里由 JVM 管理的内存区域分为下图几个模块 程序计数器Program Counter Register 程序计数器是一个比较小的内存区域用于指示当前线程所执行的字节码执行到了第几行可以理解为是当前线程的行号指示器。 字节码解释器在工作时会通过改变这个计数器的值来取下一条语句指令。 每个程序计数器只用来记录一个线程的行号所以它是线程私有一个线程就有一个程序计数器的。 如果程序执行的是一个 Java 方法则计数器记录的是正在执行的虚拟机字节码指令地址如果正在执行的是一个本地 native由 C 语言编写完成方法则计数器的值为 Undefined由于程序计数器只是记录当前指令地址所以不存在内存溢出的情况因此程序计数器也是所有JVM内存区域中唯一一个没有定义 OutOfMemoryError 的区域。 虚拟机栈JVM Stack 一个线程的每个方法在执行的同时都会创建一个栈帧Statck Frame栈帧中存储的有局部变量表、操作数栈、动态链接、方法出口等当方法被调用时栈帧在 JVM 栈中入栈当方法执行完成时栈帧出栈。 局部变量表中存储着方法的相关局部变量包括各种基本数据类型对象的引用返回地址等。 在局部变量表中只有 long 和 double 类型会占用 2 个局部变量空间Slot对于32位机器一个 Slot 就是 32 个 bit其它都是 1 个 Slot。 需要注意的是局部变量表是在编译时就已经确定好的方法运行所需要分配的空间在栈帧中是完全确定的在方法的生命周期内都不会改变。 虚拟机栈中定义了两种异常如果线程调用的栈深度大于虚拟机允许的最大深度则抛出 StatckOverFlowError栈溢出不过多数 Java 虚拟机都允许动态扩展虚拟机栈的大小有少部分是固定长度的所以线程可以一直申请栈直到内存不足此时会抛出 OutOfMemoryError内存溢出。 每个线程对应着一个虚拟机栈因此虚拟机栈也是线程私有的。 本地方法栈Native Method Statck 本地方法栈在作用运行机制异常类型等方面都与虚拟机栈相同唯一的区别是虚拟机栈是执行 Java 方法的而本地方法栈是用来执行 native 方法的在很多虚拟机中如Sun 的 JDK 默认的 HotSpot 虚拟机会将本地方法栈与虚拟机栈放在一起使用。 本地方法栈也是线程私有的。 堆区Heap 堆区是理解 Java GC 机制最重要的区域没有之一。 在 JVM 所管理的内存中堆区是最大的一块堆区也是 Java GC 机制所管理的主要内存区域堆区由所有线程共享在虚拟机启动时创建。 堆区的存在是为了存储对象实例原则上讲所有的对象都在堆区上分配内存不过现代技术里也不是这么绝对的也有栈上直接分配的。 一般的根据 Java 虚拟机规范规定堆内存需要在逻辑上是连续的在物理上不需要在实现时可以是固定大小的也可以是可扩展的目前主流的虚拟机都是可扩展的。 如果在执行垃圾回收之后仍没有足够的内存分配也不能再扩展将会抛出 OutOfMemoryError:Java heap space 异常。 关于堆区的内容还有很多将在下面“内存分配机制”中详细介绍。 方法区Method Area 在 Java 虚拟机规范中将方法区作为堆的一个逻辑部分来对待但事实上方法区并不是堆Non-Heap另外不少人的博客中将 Java GC 的分代收集机制分为 3 个代青年代老年代永久代这些作者将方法区定义为“永久代”这是因为对于之前的 HotSpot Java 虚拟机的实现方式中将分代收集的思想扩展到了方法区并将方法区设计成了永久代。 不过除 HotSpot 之外的多数虚拟机并不将方法区当做永久代HotSpot 本身也计划取消永久代。 本文中由于主要使用 Oracle JDK6.0因此仍将使用永久代一词。 方法区是各个线程共享的区域用于存储已经被虚拟机加载的类信息即加载类时需要加载的信息包括版本、field、方法、接口等信息、final 常量、静态变量、编译器即时编译的代码等。 方法区在物理上也不需要是连续的可以选择固定大小或可扩展大小并且方法区比堆还多了一个限制可以选择是否执行垃圾收集。 一般的方法区上执行的垃圾收集是很少的这也是方法区被称为永久代的原因之一HotSpot但这也不代表着在方法区上完全没有垃圾收集其上的垃圾收集主要是针对常量池的内存回收和对已加载类的卸载。 在方法区上进行垃圾收集条件苛刻而且相当困难效果也不令人满意所以一般不做太多考虑可以留作以后进一步深入研究时使用。 在方法区上定义了 OutOfMemoryError:PermGen space 异常在内存不足时抛出。 运行时常量池Runtime Constant Pool 方法区的一部分用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用符号引用就是编码是用字符串表示某个变量、接口的位置直接引用就是根据符号引用翻译出来的地址将在类链接阶段完成翻译运行时常量池除了存储编译期常量外也可以存储在运行时间产生的常量比如 String 类的 intern() 方法作用是 String 维护了一个常量池如果调用的字符 “abc” 已经在常量池中则返回池中的字符串地址否则新建一个常量加入池中并返回地址。 直接内存Direct Memory 直接内存并不是 JVM 管理的内存可以这样理解直接内存就是 JVM 以外的机器内存。 比如你有 4G 的内存JVM占用了1G则其余的 3G 就是直接内存JDK 中有一种基于通道Channel和缓冲区Buffer的内存分配方式将由 C 语言实现的 native 函数库分配在直接内存中用存储在 JVM 堆中的 DirectByteBuffer 来引用。 由于直接内存受到本机器内存的限制所以也可能出现 OutOfMemoryError 的异常。 内存分配机制 以下面代码为例来分析Java 的实例对象在内存中的空间分配。 //JVM 启动时将 Person.class 放入方法区 public class Person {//new Person 创建实例后name 引用放入堆区name 对象放入常量池private String name;//new Person 创建实例后age 0 放入堆区private int age;//Person 方法放入方法区方法内代码作为 Code 属性放入方法区public Person(String name, int age) {this.name name;this.age age;}//toString 方法放入方法区方法内代码作为 Code 属性放入方法区Overridepublic String toString() {return Person{ name name \ , age age };} } //JVM 启动时将 Test.class 放入方法区public class Test {//main 方法放入方法区方法内代码作为 Code 属性放入方法区public static void main(String[] args) {//person1 是引用放入虚拟机栈区new 关键字开辟堆内存 Person 自定义对象放入堆区Person person1 new Person(张三, 18);Person person2 new Person(李四, 20);//通过 person 引用创建 toString() 方法栈帧person1.toString();person2.toString();} } 1、首先 JVM 会将 Test.class, Person.class 加载到方法区找到有 main() 方法的类开始执行。 如上图所示JVM 找到 main() 方法入口创建 main() 方法的栈帧放入虚拟机栈开始执行 main() 方法。 Person person1 new Person(张三, 18); 执行到这句代码时JVM 会先创建 Person 实例放入堆区person2 也同理。 2、创建完 Person 两个实例main() 方法中的 person1person2 会指向堆区中的 0x0010x002这里的内存地址仅作为示范。紧接着会调用 Person 的构造函数进行赋值如下图 如上图所示新创建的的 Person 实例中的 name, age 开始都是默认值。 调用构造函数之后进行赋值name 是 String 引用类型会在常量池中创建并将地址赋值给 nameage 是基本数据类型将直接保存数值。 注Java 中基本类型的包装类的大部分都实现了常量池技术这些类是 Byte, Short, Integer, Long, Character, Boolean另外两种浮点数类型的包装类则没有实现。 基本数据类型包装类 是否实现了常量池技术byteByte 是booleanBoolean 是shortShort 是charCharacter 是intInteger 是longLong 是floatFloat 否doubleDouble 否 3、Person 实例初始化完后执行到 toString() 方法同 main() 方法一样 JVM 会创建一个 toString() 的栈帧放入虚拟机栈中执行完之后返回一个值。
http://www.zqtcl.cn/news/913099/

相关文章:

  • 装配式建筑信息平台无忧seo博客
  • 做淘客网站用备案网络推广预算方案
  • 网站建设需不需要招标好网站欣赏
  • 怎样创建网站的代码此网站域名即将过期
  • 网页转向网站jquery图片效果网站
  • 山东定制网页建站wordpress是是什么技术
  • 无锡免费网站制作手游网页版
  • 东莞 网站建设 定制水寻找常州微信网站建设
  • 在门户网站做推广网站开发需要20万
  • 网站做电商销售需要注册吗上海的公司地址
  • 给网站做选题计算机网络技术电商网站建设与运营方向
  • 网站如何做熊掌号并绑定wordpress pdf
  • wordpress页面构建器中文文山seo公司
  • 凡科免费做网站蜂箱尺寸与制作图片
  • 完全不收费的聊天软件班级优化大师下载安装app
  • 合肥网站改版360免费建站永久免费
  • 商业网站建设案例课程 下载工信部企业网站认证
  • 泉州网站设计哪家公司好沈阳seo代理计费
  • 做景观素材有哪几个网站国内建网站费用
  • 驻马店重点项目建设网站wordpress常规选项
  • 网站开发 英文网站策划建设阶段的推广
  • 建立网站一般多少钱wordpress评论跳过验证
  • 南京每月做社保明细在哪个网站查看设计作品的网站软件
  • html怎么做网站如何在腾讯云上网站建设
  • 网站建设怎么链接表格手机做外贸有什么好的网站
  • 深圳开发网站建设哪家好外贸网络营销培训
  • 广州智迅网络做网站免费下载ps素材网站
  • 什么网站时候做伪静态开发软件定制
  • 找人做网站 多少钱西宁市公司网站建设
  • 网页设计 教程网站找权重高的网站方法