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

建设注册中心网站微信网站链接怎么做

建设注册中心网站,微信网站链接怎么做,专门做酒店网站,百度权重高的网站文章目录 Java 内存模型#xff08;JMM#xff09;一、运行时数据区域划分二、程序计数器#xff08;Program Counter Register#xff09;计数器的作用 三、Java 虚拟机栈#xff08;VM Stack#xff09;四、本地方法栈#xff08;Native Method Stack#xff09;五、… 文章目录 Java 内存模型JMM一、运行时数据区域划分二、程序计数器Program Counter Register计数器的作用 三、Java 虚拟机栈VM Stack四、本地方法栈Native Method Stack五、堆Heap1、概述2、新生代、老年代3、创建对象的内存分配 六、元空间Meta Space1、作用2、发展历程1JDK 1.62JDK 1.73JDK 1.8 七、字符串常量池1、字符串的两种创建方式2、intern() 方法3、String 的拼接 Java 内存模型JMM JMM 全称 Java Memory Model 中文释义 Java 内存模型 一、运行时数据区域划分 JVM 虚拟机在执行 Java 程序过程中会把它管理的内存划分成若干个不同的数据区域‘JDK 1.8 之前分为线程共享Heap堆区、Method Area方法区、线程私有虚拟机栈、本地方法栈、程序计数器JDK 1.8以后分为线程共享Heap堆区、MetaSpace 元空间、线程私有虚拟机栈、本地方法栈、程序计数器 二、程序计数器Program Counter Register 程序计数器是一块较小的内存空间是当前线程所执行的字节码的行号指示器 字节码解释器在解释执行字节码文件工作时每当需要执行一条字节码指令时就通过改变程序计数器的值来完成。程序中的分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。程序执行过程中会不断的切换当前执行线程切换后为了能让当前线程恢复到正确的执行位置每条线程都需要有一个独立的程序计数器并且各线程之间计数器互不影响独立存储。 计数器的作用 字节码解释器通过改变程序计数器来依次读取指令从而实现代码的流程控制如顺序执行、选择、循环、异常处理在多线程的情况下程序计数器用于记录当前线程执行的位置从而当线程被切换回来的时候能够知道当前线程的运行位置程序计数器是唯一一个不会出现 OutOfMemoryError的内存区域它随着线程的创建而创建随着线程的结束而死亡 三、Java 虚拟机栈VM Stack 与程序计数器一样VM Stack虚拟机栈也是线程私有的它的生命周期和线程相同用于描述 Java 方法执行时的内存模型每次方法调用的数据都是通过栈传递的。 JMM内存区域可以粗略的区分为堆内存Heap和栈内存 (Stack)。其中栈就是VM Stack虚拟机栈或者说是虚拟机栈中局部变量表部分。 局部变量表主要存放了编译期可知的各种基本数据类型变量值boolean、byte、char、short、int、float、long、double、对象引用reference 类型它不同于对象本身可能是一个指向对象起始地址的引用指针也可能是指向一个代表对象的句柄或其他与此对象相关的位置 Java 虚拟机栈是由一个个栈帧组成而每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法出口信息。 每一次方法调用都会有一个对应的栈帧被压入 VM Stack虚拟机栈每一个方法调用结束后代表该方法的栈帧会从VM Stack虚拟机栈中弹出。 在活动线程中 只有位于栈顶的帧才是有效的 称为当前活动栈帧代表正在执行的当前方法。 在JVM执行引擎运行时 所有指令都只能针对当前活动栈帧进行操作。虚拟机栈通过 pop和 push的方式对每个方法对应的活动栈帧进行运算处理方法正常执行结束肯定会跳转到另一个栈帧上。 Java 方法有两种返回方式不管哪种返回方式都会导致当前活动栈帧被弹出 return 语句抛出异常 Java 虚拟机栈会出现两种错误StackOverFlowError 和OutOfMemoryError StackOverFlowError当线程请求栈的深度超过 JVM虚拟机栈的最大深度的时候就抛出 StackOverFlowError 错误。OutOfMemoryError JVM的内存大小可以动态扩展 如果虚拟机在动态扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError异 四、本地方法栈Native Method Stack 本地方法栈用于虚拟机调用的 Native方法 native关键字修饰的本地方法被执行的时候在本地方法栈中也会创建一个栈帧用于存放该native本地方法的局部变量表、操作数栈、动态链接、方法出口信息。方法执行完毕后相应的栈帧也会出栈并释放内存空间。也会出现 StackOverFlowError和 OutOfMemoryError两种错误 五、堆Heap 1、概述 Heap堆区用于存放对象实例和数组的内存区域 Heap堆是JVM 所管理的内存中最大的一块区域被所有线程共享的一块内存区域。堆区中存放对象实例“几乎”所有的对象实例以及数组都在这里分配内存 Java 世界中“几乎”所有的对象都在堆中分配但是随着 JIT编译器的发展与逃逸分析技术逐渐成熟栈上分配、标量替换优化技术将会导致一些微妙的变化所有的对象都分配到堆上也渐渐变得不那么“绝对”了。 从JDK 1.7 开始已经默认开启逃逸分析如果某些方法中的对象引用没有被返回或者未被外面使用也就是未逃逸出去那么对象可以直接在栈上分配内存 2、新生代、老年代 Heap 堆是 **垃圾收集器 GCGarbage Collected**管理的主要区域因此堆区也被称为 GC堆Garbage Collected Heap 从垃圾回收的角度由于现在收集器基本都采用分代垃圾收集算法所以 JVM 中的堆区往往进行分代划分例如新生代 和 老年代。目的是更好地回收内存或者更快地分配内存 Heap 堆区中的新生代、老年代的空间分配比例可以通过java -XX:PrintFlagsFinal -version命令查看 上述输出结果结果分析 InitialSurvivorRatio 8 新生代YoungEden/Survivor空间的初始比例 8代表Eden占新生代空间的80% uintx NewRatio 2 老年代Old / 新生代 Young的空间比例 2 代表老年代Old是新生代Young的2倍 因为新生代是由 Eden s0 s1 组成的所以按照上述默认比例如果 Eden 区内存大小是 40M那么两个 Survivor 区就是 5M整个新生代区就是 50M然后可以算出 Old 区内存大小是 100M堆区总大小就是 150M 3、创建对象的内存分配 创建一个新对象在堆中分配内存大部分情况下对象会在 Eden 区生成当 Eden 区装满时会触发 Young Garbage Collection即 YGC 垃圾回收时在 Eden 区实现清除策略没有被引用的对象直接被回收依然存活的对象会被移送到 Survivor 区Survivor 区分为 s0 和 s1 两块内存区域每次 YGC 的时候将存活的对象复制到未使用的 Survivor 空间s0 或 s1,然后清空正在使用的空间交换 s0 和 s1 的使用状态每次交换时 对象的Age1如果 YGC 要移送的对象大于 Survivor 区容量的上限则直接移交给老年代一个对象也不可能永远呆在新生代在 JVM 中 一个对象从新生代晋升到老年代的阈值默认值是 15可以在 Survivor区交换 14 次之后晋升至老年代 堆区最容易出现的就是 OutOfMemoryError错误这种错误的表现形式会有以下两种 OutOfMemoryError: GC Overhead Limit Exceeded 当 JVM花太多时间执行垃圾回收并且只能回收很少的堆空间时就会发生此错误。OutOfMemoryError: Java heap space****假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发此错误。 此种情况与配置的最大堆内存有关且受制于物理内存大小。 六、元空间Meta Space 1、作用 用于存放 类信息、常量、静态变量、JIT 即时编译器编译后的机器代码等数据 例如java.lang.Object类的元信息、Integer.MAX_VALUE常量等 2、发展历程 1JDK 1.6 HotSpot JVM 使用Method Area方法区存储也叫永久代(Permanent Generation)。 方法区和“永久代(Permanent Generation)”的区别方法区是JVM 的规范而永久代(Permanent Generation)是 JVM规范的一种实现并且只有 HotSpot JVM才有永久代“Permanent Generation”而对于其他类型的虚拟机如 JRockitOracle、J9IBM 并没有方法区是一片连续的堆空间当JVM加载的类信息容量超过了最大可分配空间虚拟机会抛出OutOfMemoryError:PermGenspace的Error。永久代的GC是和老年代(old generation)捆绑在一起的无论谁满了都会触发永久代和老年代的垃圾收集。可以通过 -XX:PermSizeN 设置 方法区 (永久代) 初始空间-XX:MaxPermSizeN 设置方法区 (永久代) 最大空间,超过这个值将会抛出错误java.lang.OutOfMemoryError: PermGen 2JDK 1.7 将字符串常量池、静态变量转移到了堆区。 3JDK 1.8 正式移除永久代采用 Meta Space 元空间替代 元空间的本质和永久代类似都是对JVM规范中方法区的一种具体实现。不过元空间与永久代之间最大的区别在于元空间并不在虚拟机中而是使用本地内存。因此默认情况下元空间的大小仅受本地内存限制但可以通过运行参数来指定元空间的大小。 Java 8 中 PermGen永久代为什么被移出 HotSpot JVM 由于 PermGen 内存经常会溢出容易抛出 java.lang.OutOfMemoryError: PermGen错误移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合因为 JRockit 没有永久代 **示例1**不断的生成新的字符串快速的消耗内存。通过 JDK 1.6、JDK 1.7 和 JDK 1.8 分别运行。 public class TestOOM {static String base ApeSource;public static void main(String[] args) {ListString list new ArrayListString();for (int i0;i Integer.MAX_VALUE;i){String str base base;base str;list.add(str.intern());}} }上述运行结果可以看出相同的代码在JDK 1.6 会出现“PermGen Space”的永久代内存溢出而在 JDK 1.7和 JDK 1.8 中会出现Java heap space堆内存溢出并且 JDK 1.8中 PermSize 和 MaxPermGen 参数已经无效。因此在 JDK 1.7 和 JDK 1.8 中已经将字符串常量由永久代转移到堆中并且 JDK 1.8 中已经完全移除了永久代采用元空间来代替。 **示例2**在 JDK 8下重新运行一下运行测试代码TestOOM指定 MetaSpaceSize 和 MaxMetaSpaceSize的大小输出结果如下 -XX:MetaspaceSize**参数主要控制Meta Space GC发生的初始阈值也就是最小阈值当使用的Meta Space 空间到达MetaspaceSize**的时候就会触发Metaspace的GC。-XX:MaxMetaspaceSize参数最大空间默认是没有限制的。在jvm启动的时候并不会分配MaxMetaspaceSize这么大的一块内存出来metaspace是可以一直扩容的直到到达MaxMetaspaceSize 七、字符串常量池 1、字符串的两种创建方式 第一种方式是在常量池中获取字符串对象第二种方式是直接在堆内存空间创建一个新的字符串对象 // 先检查字符串常量池中有没有abcd如果字符串常量池中没有则创建一个然后 str1 指向字符串常量池中的对象如果有则直接将 str1 指向abcd String str1 apesource; String str2 new String(apesource); //堆中创建一个新的对象 String str3 new String(apesource); //堆中创建一个新的对象System.out.println(str1str2); //false System.out.println(str2str3); //false2、intern() 方法 检查指定字符串在常量池中是否存在如果存在则返回地址如果不存在则在常量池中创建 String s1 new String(Apesource); String s2 s1.intern(); // 查看字符串常量池中是否存在Apesource如果存在则返回地址如果不存在则在常量池中创建 String s3 Apesource; // 使用常量池中的已有字符串常量ApesourceSystem.out.println(s2 s3); // true地址相同3、String 的拼接 String str1 str; String str2 ing;String str3 str ing; // 常量池中的新字符串对象 String str4 str1 str2; // 在堆中创建的新字符串对象 String str5 string; // 常量池中的已有字符串对象System.out.println(str3 str4); //false System.out.println(str3 str5); //true System.out.println(str4 str5); //falseString s1 new String(abc);这句代码创建了几个字符串对象 创建 1 或 2 个字符串。如果常量池中已存在字符串常量“abc”则只会在堆空间创建一个字符串常量“abc” 如果常量池中没有字符串常量“abc”那么它将首先在池中创建然后在堆空间中创建因此将创建总共2 个字符串对象
http://www.dnsts.com.cn/news/102089.html

相关文章:

  • 赣州做网站j北京app开发公司有哪些
  • 郑州网站建设哪家中国住建部网站查询网
  • 网站优化关键词公司广播电台网站建设方案
  • 请描述网站开发的一般流程个人网站模板素材
  • 网站建设服装项目设计书桂林做手机网站建设
  • 移动端网站建设推广方案建设部注册网站
  • 女装网站建设项目可行性分析上海专业制作网站
  • 做易经类的网站网上做家教兼职哪个网站
  • 常用网站设置如何建立自己的商城
  • 找人做的网站怎么运行外贸网站购买云服务器多少钱
  • 第一站长网厦门网站开发公
  • php网站开发招聘网络营销专业介绍及就业方向
  • 怎么更换网站模板看世界杯网址
  • 手机微网站网站图片类型
  • 企业网站模板湖南岚鸿网站建设是属现代服务吗
  • 聚美优品网站建设分析一支部一品牌一特色方案
  • 如何做自媒体网站创建设计SEO优化象客
  • 免费的网站公司网站asp后台维护
  • wordpress网站配置文件wordpress ishome
  • 绵竹网站建设天津市住房和城乡建设厅网站
  • 做企业网站哪个平台好济南建设监理协会网站
  • 网站公司做的网站被攻击南阳seo网站价格
  • 找出网站所有死链接响应式儿童网站源码
  • 建设工程规范在哪个网站下载网站开发公司目前主营业务
  • 绿色网站设计培训类网站开发
  • 企业网站模块介绍公众号简介有趣的文案
  • 品牌推广理论seo是什么职位简称
  • 网站域名备案多长时间帝国软件怎么做网站
  • 排名好的徐州网站建设定制型网站设计
  • ppt做的好的网站有哪些内容西安商城网站