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

网站建设后的心得广州大题小做考研网站

网站建设后的心得,广州大题小做考研网站,机场建设投资公司官方网站,重庆网站seo服务Java 虚拟机#xff08;JVM)在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 Java运行时数据区域是指Java虚拟机#xff08;JVM#xff09;在执行Java程序时#xff0c;为了管理内存而划分的几个不同作用域。这些区域各自承担特定的任务#xff0c…Java 虚拟机JVM)在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 Java运行时数据区域是指Java虚拟机JVM在执行Java程序时为了管理内存而划分的几个不同作用域。这些区域各自承担特定的任务并且有着不同的生命周期。根据Java虚拟机规范主要可以分为线程共享区域和线程私有区域两大类 1.程序计数器 程序计数器主要有两个作用 字节码解释器通过改变程序计数器来依次读取指令从而实现代码的流程控制如顺序执行、选择、循环、异常处理。在多线程的情况下程序计数器用于记录当前线程执行的位置从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 注意程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域它的生命周期随着线程的创建而创建随着线程的结束而死亡。 2.Java 虚拟机栈(简称栈 栈绝对算的上是 JVM 运行时数据区域的一个核心除了一些 Native 方法调用是通过本地方法栈实现的(后面会提到)其他所有的 Java 方法调用都是通过栈来实现的 方法调用-压入对应栈帧调用结束弹出栈帧 方法调用的数据需要通过栈进行传递每一次方法调用都会有一个对应的栈帧被压入栈中每一个方法调用结束后都会有一个栈帧被弹出。 栈由一个个栈帧组成而每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似两者都是先进后出的数据结构只支持出栈和入栈两种操作。 栈帧随着方法调用而创建随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。 栈帧构成 动态链接 主要服务一个方法需要调用其他方法的场景 当一个方法要调用其他方法需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。 动态链接的作用就是为了将符号引用转换为调用方法的直接引用这个过程也被称为 动态连接 。 当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候就抛出 StackOverFlowError 错误 栈还可能会出现OutOfMemoryError错误这是因为如果栈的内存大小可以动态扩展 如果虚拟机在动态扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError异常 3. 本地方法栈 虚拟机栈为虚拟机执行 Java 方法 也就是字节码服务而本地方法栈则为虚拟机使用到的 Native 方法服务 4. 堆 Java 虚拟机所管理的内存中最大的一块Java 堆是所有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例几乎所有的对象实例以及数组都在这里分配内存。 Java 世界中“几乎”所有的对象都在堆中分配 从 JDK 1.7 开始已经默认开启逃逸分析如果某些方法中的对象引用没有被返回或者未被外面使用也就是未逃逸出去那么对象可以直接在栈上分配内存 Java 堆是垃圾收集器管理的主要区域因此也被称作 GC 堆Garbage Collected Heap 在 JDK 7 版本及 JDK 7 版本之前堆内存被通常分为下面三部分新生代内存(Young Generation)老生代(Old Generation)永久代(Permanent Generation) JDK 8 版本之后 PermGen(永久代) 已被 Metaspace(元空间) 取代元空间使用的是本地内存。 5. 方法区(一个逻辑概念由metaspace实现方法区 方法区属于是 JVM 运行时数据区域的一块逻辑区域是各个线程共享的内存区域。 方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 1.整个永久代有一个 JVM 本身设置的固定大小上限无法进行调整也就是受到 JVM 内存的限制而元空间使用的是本地内存受本机可用内存的限制虽然元空间仍旧可能溢出但是比原来出现的几率会更小。 2.元空间里面存放的是类的元数据这样加载多少类的元数据就不由 MaxPermSize 控制了, 而由系统的实际可用空间来控制这样能加载的类就更多了 3、在 JDK8合并 HotSpot 和 JRockit 的代码时, JRockit 从来没有一个叫永久代的东西, 合并之后就没有必要额外的设置这么一个永久代的地方了。 4、永久代会为 GC 带来不必要的复杂度并且回收效率偏低。 运行时常量池 Class 文件中除了有类的版本、字段、方法、接口等描述信息外 还有用于存放编译期生成的各种字面量Literal和符号引用Symbolic Reference的 常量池表(Constant Pool Table) 字面量Literal) 字面量是源代码中的固定值的表示法即通过字面我们就能知道其值的含义。字面量包括整数、浮点数和字符串字面量。常见的符号引用包括类符号引用、字段符号引用、方法符号引用、接口方法符号。 运行时常量池是方法区的一部分自然受到方法区内存的限制当常量池无法再申请到内存时会抛出 OutOfMemoryError 错误 字符串常量池 为了提升性能和减少内存消耗针对字符串String 类专门开辟的一块区域主要目的是为了避免字符串的重复创建 JDK1.7 字符串常量池和静态变量从永久代移动了 Java 堆中。 为什么要将字符串常量池移动到堆中 主要是因为永久代方法区实现的 GC 回收效率太低只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收将字符串常量池放到堆中能够更高效及时地回收字符串内存。 重点概念理清 运行时常量池、方法区、字符串常量池这些都是不随虚拟机实现而改变的逻辑概念是公共且抽象的Metaspace、Heap 是与具体某种虚拟机实现相关的物理概念是私有且具体的。 Java 堆是垃圾收集器管理的主要区域因此也被称作 GC 堆Garbage Collected Heap 在 JDK 7 版本及 JDK 7 版本之前堆内存被通常分为下面三部分新生代内存(Young Generation)老生代(Old Generation)永久代(Permanent Generation) JDK 8 版本之后 PermGen(永久代) 已被 Metaspace(元空间) 取代元空间使用的是本地内存。 直接内存 直接内存是一种特殊的内存缓冲区并不在 Java 堆或方法区中分配的而是通过 JNI 的方式在本地内存上分配的。 JNI–java native interface 虚拟机在 Java 堆中对象创建过程 Step1:类加载检查 虚拟机遇到一条 new 指令时首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有那必须先执行相应的类加载过程。 Step2:分配内存。 对象所需的内存大小在类加载完成后便可确定为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种选择哪种分配方式由 Java 堆是否规整决定而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。 在实际开发过程中创建对象是很频繁的事情作为虚拟机来说必须要保证线程是安全的通常来讲虚拟机采用两种方式来保证线程安全 CAS失败重试 CAS(compare and swap) 是乐观锁的一种实现方式。所谓乐观锁就是每次不加锁而是假设没有冲突而去完成某项操作如果因为冲突失败就重试直到成功为止。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。 TLAB 为每一个线程预先在 Eden 区分配一块儿内存JVM 在给线程中的对象分配内存时首先在 TLAB 分配当对象大于 TLAB 中的剩余内存或 TLAB 的内存已用尽时再采用上述的 CAS 进行内存分配 Step3:初始化零值 内存分配完成后虚拟机需要将分配到的内存空间都初始化为零值不包括对象头这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用程序能访问到这些字段的数据类型所对应的零值。 Step4:设置对象头 虚拟机要对对象进行必要的设置例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 Step5:执行 init 方法 从虚拟机的视角来看一个新的对象已经产生了但从 Java 程序的视角来看对象创建才刚开始 方法还没有执行所有的字段都还为零。所以一般来说执行 new 指令之后会接着执行 方法把对象按照程序员的意愿进行初始化这样一个真正可用的对象才算完全产生出来 对象的内存布局 虚拟机中对象在内存中的布局可以分为 3 块区域对象头Header、实例数据Instance Data和对齐填充Padding 对象的访问方式 建立对象就是为了使用对象我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定目前主流的访问方式有使用句柄、直接指针。 使用句柄 直接指针 使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址在对象被移动时只会改变句柄中的实例数据指针而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快它节省了一次指针定位的时间开销
http://www.laogonggong.com/news/108992.html

相关文章:

  • c 如何做网站高端网名生成器
  • 国外简约企业网站泰安网站建设收益
  • 放单网站wordpress 伪静态 cdn
  • 网站备案没通过不了网站的流程图
  • flashfxp 网站网络营销策略概述
  • 礼物说网站模板上海创意型网站建设
  • 做网站后端需要什么语言python flask做网站
  • 湖南网站定制网站开发公司排名
  • dedecms怎么部署网站上海建设工程造价信息网站
  • 电商运营岗位职责seo网站建设公司
  • 自己做的网站怎么放视频广东衍发建设管理有限公司公司网站
  • 网站开发私活分成宁波网站建设公司费用价格
  • 网站开发实战asp制作视频企业内部网页设计
  • 静态页面网站站标代码写进到静态页面了 怎么不显示呢?wordpress rss 下一页
  • 想建个网站找谁如何做学校网站
  • 网站做搜索引擎的作用是什么开发公司空置房物业费会计科目
  • 做网站字体未支付网站建设挂哪个科目
  • 设计一个个人网站的具体步骤wordpress特定页面设为主页
  • 临安建设工程规划公示网站软文发稿
  • 江西省建设工程协会网站查询医疗网站开发ppt
  • 团建网站建设网站后台更新了文章为何看不见
  • 龙华做网站公司如何提高网站关键词的排名
  • 网站建设公司山西网站对联广告图片
  • 企业类网站设计wordpress外汇主题
  • c#网站开发框架有seo厂商
  • 苏州木渎做网站公司广告设计与制作学啥
  • 那些网站做推广网络规划设计师资料网盘下载
  • 织梦 手机网站模板专业外贸网站
  • 科技企业网站wordpress olam主题
  • 网站建设大连创时代今天上海出什么大事了