LDC

深入分析String.intern和String常量的实现原理

瘦欲@ 提交于 2019-12-05 05:46:59
背景 字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现: 1、同一个字符串常量,在常量池只有一份副本; 2、通过双引号声明的字符串,直接保存在常量池中; 3、如果是String对象,可以通过String.intern方法,把字符串常量保存到常量池中; 本文JVM源码版本 openjdk-7-fcs-src-b147-27 疑惑 在不同环境执行上述代码,会得到不同的结果,为什么? 1、JDK1.6的结果: false false 2、JDK1.7的结果: true false 解惑 其中 String.intern 在java中是native方法,JDK1.7的注释如下: 1、执行intern方法时,如果常量池中存在和String对象相同的字符串,则返回常量池中对应字符串的引用; 2、如果常量池中不存在对应的字符串,则添加该字符串到常量中,并返回字符串引用; HotSpot1.6实现 常量池的内存在永久代进行分配,永久代和Java堆的内存是物理隔离的,执行intern方法时,如果常量池不存在该字符串,虚拟机会在常量池中复制该字符串,并返回引用,使用intern方法时需要谨慎,避免常量池中字符串过多,导致性能变慢,甚至发生PermGen内存溢出。 显然 s

创龙TI AM437x ARM Cortex-A9 CPU ADC接口、LDC触摸屏接口

允我心安 提交于 2019-12-04 11:39:15
TL437x-Easy EVM是 广州创龙基于SOM-TL437x核心板研发的 一款 TI ARM Cortex-A9开发板, 采用核心板+底板 方式, 尺寸为 175 mm * 1 10m m, 核心板采用4*60pin B2B工业级连接器 , 稳定、可靠、便捷,可以帮助客户 快速评估 核心板 性能。 SOM-TL437x 核心板采用高密度沉金无铅工艺 8 层板设计,尺寸为5 8 mm * 3 5 mm,采用美国德州仪器最新Cortex -A9 CPU AM437x, 高性能与低功耗有机结合。采用 耐高温、体积小、 精 度高的B2B连接器,引出了核心板的全部接口资源,帮助开发者快速进行二次开发 。 TL437x-Easy EVM开发板 底板 采用 两 层无铅沉金电路板设计,为了方便用户学习开发参考使用,上面引出了各种常见的接口。 ADC接口 板载2个8路 12bit的ADC接口:ADC0和ADC1,分别对应J1、J2接口,接口定义如下图所示: LCD触摸屏接口 CON17 为 40pin 、 0.5mm间距LCD触摸屏接口, 使用 FFC排线座。LCD接口包含了常见LCD所用全部控制信号 ( 行场扫描、时钟和使能等 ) 。其中,1、2、3、4四线为触摸屏接口,接口定义如下图所示: 来源: https://my.oschina.net/u/4169033/blog/3129769

Java虚拟机的指令

放肆的年华 提交于 2019-11-29 07:07:11
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。 基本数据类型 1、除了long和double类型外,每个变量都占局部变量区中的一个变量槽(slot),而long及double会占用两个连续的变量槽。 2、大多数对于boolean、byte、short和char类型数据的操作,都使用相应的int类型作为运算类型。 加载和存储指令 1、将一个局部变量加载到操作栈:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>。 2、将一个数值从操作数栈存储到局部变量表:istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n>。 3、将一个常量加载到操作数栈:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d>。 4、扩充局部变量表的访问索引的指令:wide。 _<n>:_0、_1、_2、_3,

String ,  StringBuffer ,  StringBuilder的区别

做~自己de王妃 提交于 2019-11-27 04:00:31
String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可以从它的源码中看到,它是使用一个 final 的数组来存放内容的,即表示它是一个常量。 /** The value is used for character storage. */ private final char value[]; 接下来看个例子: public class Main { public static void main(String[] args) { String s1 = "a"; String s2 = "a"; String s3 = new String("a"); System.out.println(s1 == s2); // true System.out.println(s1 == s3); // false String s4 = new String("b"); String s5 = new String("b"); System.out.println(s4 == s5); // false String s6 = "a" + "b"; String s7 = "ab"; System.out

程序打成jar包路径不对、找不到配置文件的解决

坚强是说给别人听的谎言 提交于 2019-11-26 14:04:19
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码: //源代码1: package edu.hxraid; import java.io.*; public class Resource { public void getResource() throws IOException{ File file=new File("bin/resource/res.txt"); BufferedReader br=new BufferedReader(new FileReader(file)); String s=""; while((s=br.readLine())!=null) System.out.println(s); } } 这段代码写在Eclipse建立的java Project中,其目录为:(其中将资源文件res.txt放在了bin目录下,以便打成jar包) 1、src/ src/edu/hxraid/Resource.java 2、bin/ bin/resource/res.txt bin/edu/hxraid/Resource.class 很显然运行源代码1是能够找到资源文件res.txt

击穿JVM虚拟机

你离开我真会死。 提交于 2019-11-25 23:17:40
什么是JVM虚拟机 首先我们需要了解什么是虚拟机,为什么虚拟机可以实现夸平台,虚拟机在计算机中扮演一个什么样的角色。 (从下向上看) 看上图的操作系统与虚拟机层,可以看到,JVM是在操作系统之上的。他帮我们解决了操作系统差异性操作问题,所以可以帮我们实现夸操作系统。 JVM是如果实现夸操作系统的呢? 接着向上看,来到虚拟机可解析执行文件这里,虚拟机就是根据这个.class的规范来实现夸平台的。 在向上到语言层,不同的语言可以有自己的语法、实现方式,但最终都要编译为一个满足.class规范的文件,来让虚拟机执行。 所以理论上,任何语言想使用JVM虚拟机实现夸平台的操作,都可以根据规范生成.class文件,就可以使用JVM,并实现“一次编译,多次运行”。 虚拟机具体帮我们都做了哪些工作? 字节码规范(.class) 内存管理 第一点已经在上边说过,不在重复。 第二点内存管理也是我们接下来主要讲的内容。在没有JVM的时代,在C/C++时期,写代码中除了写正常的业务代码之外,有很大一部分代码是内存分配与销毁相关的代码。稍有不慎就会造成内存泄露。而使用虚拟机之后关于内存的分配、销毁操作就都由虚拟机来管理了。 相对的肯定会造成虚拟机占用更多内存,在性能上与C/C++对比会较差,但随着虚拟机的慢慢成熟性能差距正在缩小。 JVM架构 Jvm虚拟机主要分为五大模块:类装载子系统、运行时数据区