LDC

工作10年后,再看String s = new String("xyz") 创建了几个对象?

半世苍凉 提交于 2021-02-19 02:57:15
点击上方蓝色“ 方志朋 ”,选择“设为星标” 回复“ 666 ”获取独家整理的学习资料! 转自:艾小仙 这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的。 从方法区说起 常量池存在于方法区,而方法区在jdk1.7版本前后改变比较大,所以还是先来说说方法区的演变。 在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分,他有一个名字叫做 非堆 。 1.7版本把字符串常量池放到了堆中。 而在1.8以后,则是移除了永久代,方法区概念保留,方法区的实现改为了元空间,常量池还是在堆中。 为什么要说方法区的改变,只是为了文章接下来的内容不会由于JDK的版本而产生分歧,接下来内容都会以jdk1.8版本作为基础来讨论。 String s = new String("xyz"); 先来一段代码 public class Test { public static void main (String[] args) { String s = "xyz" ; } } 接着我们javac编译代码,然后用javap来反编译,执行javap -c Test 从结果来看,ldc命令 在常量池中创建了一个"xyz"的对象

工作10年后,再看String s = new String("xyz") 创建了几个对象?

梦想的初衷 提交于 2021-02-19 02:28:03
点击上方 " 程序员小乐 "关注, 星标或置顶一起成长 后台回复“ 大礼包 ”有惊喜礼包! 关注订阅号「 程序员小乐 」,收看更多精彩内容 每日英文 When a person cannot answer directly to ur question, probably the answer is too painful for you to know or too hard for them to admit. 如果一个人不正面回答你的问题,可能是说出来你难以接受,或者他们不愿意承认。 每日掏心话 一生中,最光辉的一天并非功成名就的那一天,而是从悲叹与绝望中产生对人生挑战与勇敢迈向意志的那一天。 来 自 :艾小仙 | 责编:乐乐 后端架构师(ID:study_tech) 第 1085 次推文 往日回顾: 2020 中国软件 100 强,腾讯第二、阿里第三,他第一! 正文 这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的。 从方法区说起 常量池存在于方法区,而方法区在jdk1.7版本前后改变比较大,所以还是先来说说方法区的演变。 在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分

《深入理解Java虚拟机》- JVM是如何实现反射的

邮差的信 提交于 2021-02-07 06:46:09
Java反射学问很深,这里就浅谈吧。如果涉及到方法内联,逃逸分析的话,我们就说说是什么就好了。有兴趣的可以去另外看看,我后面可能也会写一下。(因为我也不会呀~) 一、Java反射是什么? 反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。 反射是由类开始的,从class对象中,我们可以获得有关该类的全部成员的完整列表;可以找出该类的所有类型、类自身信息。 二、反射的一些应用 1、java集成开发环境,每当我们敲入点号时,IDE便会根据点号前的内容,动态展示可以访问的字段和方法。 2、java调试器,它能够在调试过程中枚举某一对象所有字段的值。 3、web开发中,我们经常接触到各种配置的通用框架。为保证框架的可扩展性,他往往借助java的反射机制。例如Spring框架的依赖反转(IOC)便是依赖于反射机制。 三、Java反射的实现 1. Java反射使用的api(列举部分,具体在rt.jar包的java.lang.reflect.*)中 列举Class.java中的一些方法。这些都很常用,比如在你尝试编写一个mvc框架的时候,就可以参照这个类里面的方法,再结合一些Servlet的api就实现一个简单的框架。 2.代码实现 2.1 代码实现的目的:说明反射调用是有两种方式,一种是本地实现,另一种是委派实现。

JVM指令手册

℡╲_俬逩灬. 提交于 2021-01-09 20:42:03
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引) 从栈中的局部变量中装载值的指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值(refernce)

JVM指令手册

爷,独闯天下 提交于 2021-01-09 20:41:40
可以使用javap -c t.class > t.txt 命令将class文件输出到txt文档来结合以下指令分析代码。 栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入操作数栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引) 从栈中的局部变量中装载值的指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload

深入JVM(一)JVM指令手册

爷,独闯天下 提交于 2021-01-09 18:05:20
本文按照如下思维导图组织 1. 栈和局部变量操作 1.1 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引) 1.2 从栈中的局部变量中装载值的指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload

手把手教你Laya引擎一键发布华为快游戏

自作多情 提交于 2021-01-04 15:24:25
发布、调试环境准备 华为品牌的手机。 PC电脑的与手机数据连接线,并保障发布时处于连接状态。 注意:因为华为快游戏不会生成发布二维码,需要在发布的时候,就保障数据线是连通的,否则LayaAirIDE发布的时候,只会生成一个rpk的包,最终还是要联数据线,手工复制rpk包到相关路径下。 安装nodejs 环境,必须要安装 10.x 稳定版本 ,如果不是的需要重新安装[node官网: https://nodejs.org/download/release/latest-v10.x/ ] LayaAirIDE集中开发环境,LayaAir 2.8.1 或以上版本 [ 官网下载: https://ldc2.layabox.com/layadownload/?type=layaairide ] 发布前准备工作 为了让发布华为快游戏顺利一些,有一些检查工作我们要做。 PC里,node环境、LayaAirIDE这些,都必须要安装好(ADB以及OpenSSL无需单独安装,LayaAir引擎IDE已内置)。 手机里,要打开”开发者模式“,允许USB调试。如下图所示。 打开”开发者模式“的操作如有疑问,也可以参考华为官方指引文档: https://developer.huawei.com/consumer/cn/doc/quickapp-open-developer-option

54.4万笔/秒!支付宝的技术到底有多强?

痴心易碎 提交于 2020-12-05 06:40:02
自 2008 年双 11 以来,在每年双 11 超大规模流量的冲击上,蚂蚁金服都会不断突破现有技术的极限。2010 年双 11 的支付峰值为 2 万笔/分钟,到 2017 年双 11 时这个数字变为了 25.6 万笔/秒。 2018 年双 11 的支付峰值为 48 万笔/秒 ,2019 年双 11 支付峰值为 54.4 万笔/秒,创下新纪录,是 2009 年第一次双 11 的 1360 倍。 在如此之大的支付 TPS 背后除了削峰等锦上添花的应用级优化,最解渴最实质的招数当数基于分库分表的单元化了,蚂蚁技术称之为 LDC(逻辑数据中心)。 本文不打算讨论具体到代码级的分析,而是尝试用最简单的描述来说明其中最大快人心的原理。 我想关心分布式系统设计的人都曾被下面这些问题所困扰过: 支付宝海量支付背后最解渴的设计是啥?换句话说,实现支付宝高 TPS 的最关键的设计是啥? LDC 是啥?LDC 怎么实现异地多活和异地灾备的? CAP 魔咒到底是啥?P 到底怎么理解? 什么是脑裂?跟 CAP 又是啥关系? 什么是 PAXOS,它解决了啥问题? PAXOS 和 CAP 啥关系?PAXOS 可以逃脱 CAP 魔咒么? Oceanbase 能逃脱 CAP 魔咒么? 如果你对这些感兴趣,不妨看一场赤裸裸的论述,拒绝使用晦涩难懂的词汇,直面最本质的逻辑。 LDC 和单元化 LDC(logic

LayaAir2.8新增适配华为快游戏!

谁说胖子不能爱 提交于 2020-11-18 03:00:51
为了让开发者尽快的体验到华为快游戏,我们在LayaAir 2.8.0正式版之前,追加了华为快游戏的适配,提前推出支持华为快游戏LayaAir 2.8.0beta2版本。 华为快游戏平台简介 快应用是一种基于行业标准开发的新型免安装应用,其标准由主流手机厂商组成的快应用联盟联合制定。开发者开发一次即可将应用分发到所有支持行业标准的手机运行。 华为快游戏支持将现有HTML5游戏项目通过LayaAirIDE,直接发布打包成快应用形式进行发布。在华为GPU Turbo手机运行时速度更快,更省电。 华为快游戏的入口资源: 应用市场首页快应用中心推荐 应用市场首页底部:即点即玩游戏 应用市场游戏页面底部:即点即玩,无需下载 游戏中心推荐页底部:即点即玩,无需下载 游戏中心分类页灯笼位置 精品快游戏专题 月度精品推荐 华为快游戏发布与调试环境准备 华为品牌的手机。 PC电脑的与手机数据连接线,并保障发布时处于连接状态。 因为华为快游戏不会生成发布二维码,需要在发布的时候,就保障数据线是连通的,否则LayaAirIDE发布的时候,只会生成一个rpk的包,最终还是要联数据线,手工复制rpk包到相关路径下。 安装nodejs 环境,必须要安装 10.x 稳定版本 ,如果不是的需要重新安装。node官网:https://nodejs.org/download/release/latest-v10.x/

Java 干货之深入理解String

安稳与你 提交于 2020-11-16 04:58:17
可以证明,字符串操作是计算机程序设计中最常见的行为,尤其是在Java大展拳脚的Web系统中更是如此。 ---《Thinking in Java》 提到Java中的String,总是有说不完的知识点,它对于刚接触Java的人来说,有太多太多的值得研究的东西了,可是为什么Java中的String这么独特呢?今天我们来一探究竟。 基本数据类型 众所周知Java有八大基本数据类型,那么基本数据类型与对象有什么异同呢? 基本数据类型不是对象 基本数据类型能直接存储变量对应的值在堆栈中,存取更加高效 使用方便,不用new创建,每次表示都不用新建一个对象 字面量与赋值 什么叫字面值呢?考虑下面代码: int a=3; double d=3.32; long l=102322332245L; 其中,3、3.32、102322332245L便叫做字面值。3默认是int类型,3.32默认是double类型,102322332245默认也是int类型,所以必须加一个L来将它修改为long类型,否则编译器就会报错,字面量可以直接在计算机中表示。 基本数据类型便可以直接通过字面值进行赋值 String与基本数据类型 话说了这么多,这和String有什么关系呢?正如本文最开始所说,因为Java需要常常与字符串打交道,因此Java的设计者想要将String类型在 使用上 和 性能上 尽量像基本数据类型一样。