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

网站seo啥意思诸暨东莞网站建设公司

网站seo啥意思,诸暨东莞网站建设公司,asp网站建设下载,网站如何注册域名写在前面#xff08;常见面试题#xff09; 基本问题#xff1a; 介绍下 Java 内存区域#xff08;运行时数据区#xff09;Java 对象的创建过程#xff08;五步#xff0c;建议能默写出来并且要知道每一步虚拟机做了什么#xff09;对象的访问定位的两种方式#xff… 写在前面常见面试题 基本问题 介绍下 Java 内存区域运行时数据区Java 对象的创建过程五步建议能默写出来并且要知道每一步虚拟机做了什么对象的访问定位的两种方式句柄和直接指针两种方式拓展问题: String类和常量池8种基本类型的包装类和常量池Java程序员必看文档 哈哈 皮一下我自己开源的一个Java学习指南文档。一份涵盖大部分Java程序员所需要掌握的核心知识正在一步一步慢慢完善期待您的参与。Github地址https://github.com/Snailclimb/Java-Guide 。看一眼我觉得你一定不会后悔如果可以的话可以给个Star鼓励一下 1 概述 对于 Java 程序员来说在虚拟机自动内存管理机制下不再需要像C/C程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机一旦出现内存泄漏和溢出方面的问题如果不了解虚拟机是怎样使用内存的那么排查错误将会是一个非常艰巨的任务。 2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 这些组成部分一些事线程私有的其他的则是线程共享的。 线程私有的 程序计数器虚拟机栈本地方法栈线程共享的 堆方法区直接内存2.1 程序计数器 程序计数器是一块较小的内存空间可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。 另外为了线程切换后能恢复到正确的执行位置每条线程都需要有一个独立的程序计数器各线程之间计数器互不影响独立存储我们称这类内存区域为“线程私有”的内存。 2.2 Java 虚拟机栈 与程序计数器一样Java虚拟机栈也是线程私有的它的生命周期和线程相同描述的是 Java 方法执行的内存模型。 Java 内存可以粗糙的区分为堆内存Heap和栈内存(Stack),其中栈就是现在说的虚拟机栈或者说是虚拟机栈中局部变量表部分。 局部变量表主要存放了编译器可知的各种数据类型boolean、byte、char、short、int、float、long、double、对象引用reference类型它不同于对象本身可能是一个指向对象起始地址的引用指针也可能是指向一个代表对象的句柄或其他与此对象相关的位置。 2.3 本地方法栈 和虚拟机栈所发挥的作用非常相似区别是 虚拟机栈为虚拟机执行 Java 方法 也就是字节码服务而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。 2.4 堆 Java 虚拟机所管理的内存中最大的一块Java 堆是所有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例几乎所有的对象实例以及数组都在这里分配内存。 Java 堆是垃圾收集器管理的主要区域因此也被称作GC堆Garbage Collected Heap.从垃圾回收的角度由于现在收集器基本都采用分代垃圾收集算法所以Java堆还可以细分为新生代和老年代在细致一点有Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存或者更快地分配内存。 2.5 方法区 方法区与 Java 堆一样是各个线程共享的内存区域它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分但是它却有一个别名叫做 Non-Heap非堆目的应该是与 Java 堆区分开来。 HotSpot 虚拟机中方法区也常被称为 “永久代”本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意因为这样更容易遇到内存溢出问题。 相对而言垃圾收集行为在这个区域是比较少出现的但并非数据进入方法区后就“永久存在”了。 2.6 运行时常量池 运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外还有常量池信息用于存放编译期生成的各种字面量和符号引用 既然运行时常量池时方法区的一部分自然受到方法区内存的限制当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。 JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来在 Java 堆Heap中开辟了一块区域存放运行时常量池。同时在 jdk 1.8中移除整个永久代取而代之的是一个叫元空间Metaspace的区域 推荐阅读《Java中几种常量池的区分》 https://blog.csdn.net/qq_26222859/article/details/73135660 2.7 直接内存 直接内存并不是虚拟机运行时数据区的一部分也不是虚拟机规范中定义的内存区域但是这部分内存也被频繁地使用。而且也可能导致OutOfMemoryError异常出现。 JDK1.4中新加入的 NIO(New Input/Output) 类引入了一种基于通道Channel 与缓存区Buffer 的 I/O 方式它可以直接使用Native函数库直接分配堆外内存然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能因为避免了在 Java 堆和 Native 堆之间来回复制数据。 本机直接内存的分配不会收到 Java 堆的限制但是既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。 3 HotSpot 虚拟机对象探秘 通过上面的介绍我们大概知道了虚拟机的内存情况下面我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。 3.1 对象的创建 下图便是 Java 对象的创建过程我建议最好是能默写出来并且要掌握每一步在做什么。   ①类加载检查 虚拟机遇到一条 new 指令时首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有那必须先执行相应的类加载过程。 ②分配内存 在类加载检查通过后接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种选择那种分配方式由 Java 堆是否规整决定而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。 内存分配的两种方式补充内容需要掌握 选择以上两种方式中的哪一种取决于 Java 堆内存是否规整。而 Java 堆内存是否规整取决于 GC 收集器的算法是标记-清除还是标记-整理也称作标记-压缩值得注意的是复制算法内存也是规整的     内存分配并发问题补充内容需要掌握 在创建对象的时候有一个很重要的问题就是线程安全因为在实际开发过程中创建对象是很频繁的事情作为虚拟机来说必须要保证线程是安全的通常来讲虚拟机采用两种方式来保证线程安全 CAS失败重试 CAS 是乐观锁的一种实现方式。所谓乐观锁就是每次不加锁而是假设没有冲突而去完成某项操作如果因为冲突失败就重试直到成功为止。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。TLAB 为每一个线程预先在Eden区分配一块儿内存JVM在给线程中的对象分配内存时首先在TLAB分配当对象大于TLAB中的剩余内存或TLAB的内存已用尽时再采用上述的CAS进行内存分配③初始化零值内存分配完成后虚拟机需要将分配到的内存空间都初始化为零值不包括对象头这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用程序能访问到这些字段的数据类型所对应的零值。 ④设置对象头 初始化零值完成之后虚拟机要对对象进行必要的设置例如这个对象是那个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外根据虚拟机当前运行状态的不同如是否启用偏向锁等对象头会有不同的设置方式。 ⑤执行 init 方法 在上面工作都完成之后从虚拟机的视角来看一个新的对象已经产生了但从 Java 程序的视角来看对象创建才刚开始init 方法还没有执行所有的字段都还为零。所以一般来说执行 new 指令之后会接着执行 init 方法把对象按照程序员的意愿进行初始化这样一个真正可用的对象才算完全产生出来。 3.2 对象的内存布局 在 Hotspot 虚拟机中对象在内存中的布局可以分为3快区域对象头、实例数据和对齐填充。 Hotspot虚拟机的对象头包括两部分信息第一部分用于存储对象自身的自身运行时数据哈希吗、GC分代年龄、锁状态标志等等另一部分是类型指针即对象指向它的类元数据的指针虚拟机通过这个指针来确定这个对象是那个类的实例。 实例数据部分是对象真正存储的有效信息也是在程序中所定义的各种类型的字段内容。 对齐填充部分不是必然存在的也没有什么特别的含义仅仅起占位作用。 因为Hotspot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍换句话说就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数1倍或2倍因此当对象实例数据部分没有对齐时就需要通过对齐填充来补全。 3.3 对象的访问定位 建立对象就是为了使用对象我们的Java程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式有虚拟机实现而定目前主流的访问方式有①使用句柄和②直接指针两种 句柄 如果使用句柄的话那么Java堆中将会划分出一块内存来作为句柄池reference 中存储的就是对象的句柄地址而句柄中包含了对象实例数据与类型数据各自的具体地址信息  直接指针 如果使用直接指针访问那么 Java 堆对像的布局中就必须考虑如何防止访问类型数据的相关信息reference 中存储的直接就是对象的地址。    这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址在对象被移动时只会改变句柄中的实例数据指针而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快它节省了一次指针定位的时间开销。 四 重点补充内容 String 类和常量池 1 String 对象的两种创建方式 String str1 abcd; String str2 new String(abcd); System.out.println(str1str2);//false 这两种不同的创建方法是有差别的第一种方式是在常量池中拿对象第二种方式是直接在堆内存空间创建一个新的对象。 记住只要使用new方法便需要创建新的对象。 2 String 类型的常量池比较特殊。它的主要使用方法有两种 直接使用双引号声明出来的 String 对象会直接存储在常量池中。如果不是用双引号声明的 String 对象可以使用 String 提供的 intern 方String.intern() 是一个 Native 方法它的作用是如果运行时常量池中已经包含一个等于此 String 对象内容的字符串则返回常量池中该字符串的引用如果没有则在常量池中创建与此 String 内容相同的字符串并返回常量池中创建的字符串的引用。 String s1 new String(计算机); String s2 s1.intern(); String s3 计算机; System.out.println(s2);//计算机 System.out.println(s1 s2);//false因为一个是堆内存中的String对象一个是常量池中的String对象 System.out.println(s3 s2);//true因为两个都是常量池中的String对 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);//false     尽量避免多个字符串拼接因为这样会重新创建对象。如果需要改变字符串的花可以使用 StringBuilder 或者 StringBuffer。 String s1 new String(abc);这句话创建了几个对象 创建了两个对象。 验证 String s1 new String(abc);// 堆内存的地值值 String s2 abc; System.out.println(s1 s2);// 输出false,因为一个是堆内存一个是常量池的内存故两者是不同的。 System.out.println(s1.equals(s2));// 输出true 结果 false true解释 先有字符串abc放入常量池然后 new 了一份字符串abc放入Java堆(字符串常量abc在编译期就已经确定放入常量池而 Java 堆上的abc是在运行期初始化阶段才确定)然后 Java 栈的 str1 指向Java堆上的abc。 8种基本类型的包装类和常量池 Java 基本类型的包装类的大部分都实现了常量池技术即Byte,Short,Integer,Long,Character,Boolean这5种包装类默认创建了数值[-128127]的相应类型的缓存数据但是超出此范围仍然会去创建新的对象。两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。 Integer i1 33; Integer i2 33; System.out.println(i1 i2);// 输出true Integer i11 333; Integer i22 333; System.out.println(i11 i22);// 输出false Double i3 1.2; Double i4 1.2; System.out.println(i3 i4);// 输出false Integer 缓存源代码 /** *此方法将始终缓存-128到127包括端点范围内的值并可以缓存此范围之外的其他值。 */public static Integer valueOf(int i) { if (i IntegerCache.low i IntegerCache.high) return IntegerCache.cache[i (-IntegerCache.low)]; return new Integer(i); } 应用场景 1. Integer i140Java 在编译的时候会直接将代码封装成Integer i1Integer.valueOf(40);从而使用常量池中的对象。 2. Integer i1 new Integer(40);这种情况下会创建新的对象。 Integer i1 40; Integer i2 new Integer(40); System.out.println(i1i2);//输出false Integer比较更丰富的一个例子: Integer i1 40; Integer i2 40; Integer i3 0; Integer i4 new Integer(40); Integer i5 new Integer(40); Integer i6 new Integer(0); System.out.println(i1i2 (i1 i2)); System.out.println(i1i2i3 (i1 i2 i3)); System.out.println(i1i4 (i1 i4)); System.out.println(i4i5 (i4 i5)); System.out.println(i4i5i6 (i4 i5 i6)); System.out.println(40i5i6 (40 i5 i6)); 结果 i1i2 true i1i2i3 true i1i4 false i4i5 false i4i5i6 true 40i5i6 true解释 语句i4 i5 i6因为这个操作符不适用于Integer对象首先i5和i6进行自动拆箱操作进行数值相加即i4 40。然后Integer对象无法与数值进行直接比较所以i4自动拆箱转为int值40最终这条语句转为40 40进行数值比较。 写在最后 开源文档推荐 Java-Guide一份涵盖大部分Java程序员所需要掌握的核心知识正在一步一步慢慢完善期待您的参与。 Github地址https://github.com/Snailclimb/Java-Guide 参考 《深入理解Java虚拟机JVM高级特性与最佳实践第二版》《实战java虚拟机》https://www.cnblogs.com/CZDblog/p/5589379.htmlhttps://www.cnblogs.com/java-zhao/p/5180492.htmlhttps://blog.csdn.net/qq_26222859/article/details/73135660https://blog.csdn.net/cugwuhan2014/article/details/78038254 转载于:https://www.cnblogs.com/Chary/p/No0000187.html
http://www.zqtcl.cn/news/906710/

相关文章:

  • 山西做网站费用温州做网站制作
  • 购买域名后 可以做网站么苏州市建设厅网站
  • 网站域名如何查询win7优化配置的方法
  • 免费建网站的服务器佛山城市建设工程有限公司
  • 安溪人做的网站wordpress 单页面 主题
  • 品牌型网站设计创意 国外 网站
  • o2o网站建设包括哪些平面设计作品欣赏
  • 万齐网站建设成都旅游攻略自由行攻略地图
  • 新网做网站流程app下载汅api未满入内
  • 邓州网站建设建设摩托车价格大全
  • 关闭网站怎么不保存我做的更改软件工程师英文
  • 垦利网站定制提供哈尔滨网站建设服务
  • 谷歌在线浏览器入口seo内容优化是什么意思
  • 新闻门户网站免费建设西安做企业网站哪家做的好
  • 湘潭网站建设 w磐石网络安徽省工程建设信息网官方网站
  • 移动端网站开发教程局网站建设工作征求意见
  • 浙江网站建设公司地址南京做电商网站的公司
  • 网上销售型的企业网站建行个人手机银行
  • 网站建设与规划方案书网站建设策划有哪些
  • 手机网站建设推广方案ppt模板单页企业官网模板
  • 荥阳网站建设多少钱长沙企业关键词优化哪家好
  • 网站购物流程模块怎么实现最新足球赛事
  • 网站建设后需要维护吗网站规划的案例
  • 北京造价员变更在哪个网站做免费域名申请入口
  • 百度免费收录提交入口seo wordpress theme
  • 公司付网站会员费科目怎么做wordpress 多站点 主题
  • 做深度的互联网站网站突然没收录了
  • 网站建设进度表下载周到的商城网站建设
  • 建设一个连接的网站服装企业网站源码
  • 什么网站源码做分类信息网站好域名备案企业网站内容