LDC

String字符串性能优化的几种方案

独自空忆成欢 提交于 2020-04-18 04:07:11
String字符串是系统里最常用的类型之一,在系统中占据了很大的内存,因此,高效地使用字符串,对系统的性能有较好的提升。 针对字符串的优化,我在工作与学习过程总结了以下三种方案作分享: 一.优化构建的超大字符串   验证环境:jdk1.8   反编译工具:jad 1.下载反编译工具jad,百度云盘下载: 链接:https://pan.baidu.com/s/1TK1_N769NqtDtLn28jR-Xg 提取码:ilil 2.验证 先执行一段例子1代码: 1 public class test3 { 2 public static void main(String[] args) { 3 String str="ab"+"cd"+"ef"+"123" ; 4 } 5 } 执行完成后,用反编译工具jad进行反编译:jad -o -a -s d.java test.class 反编译后的代码: 1 // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. 2 // Jad home page: http://www.kpdus.com/jad.html 3 // Decompiler options: packimports(3) annotate 4 // Source File Name: test.java 5

对象的创建

感情迁移 提交于 2020-03-17 22:26:26
某厂面试归来,发现自己落伍了!>>> Objcet obj = new Objcet() 我创建了一个对象实例,我很好奇,JVM在这个期间干了什么 类加载的时机 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑定)。请注意,这里笔者写的是按部就班地“开始”,而不是按部就班地“进行”或按部就班地“完成”,强调这点是因为这些阶段通常都是互相交叉地混合进行的,会在一个阶段执行的过程中调用、激活另一个阶段。 关于在什么情况下需要开始类加载过程的第一个阶段“加载”,《Java虚拟机规范》中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,《Java虚拟机规范》则是严格规定了有且只有六种情况必须立即对类进行“初始化”(而加载、验证

为什么给Java代码加个空行,class文件就翻脸不认人了?

这一生的挚爱 提交于 2020-02-28 07:12:13
为了写出这几行优美的代码,主要是为了让它输出优美动听的乐符,我下了一番功夫。你不要觉得简单,我把它打印出来给普通的保洁阿姨去看,阿姨竟然连xjjdog都认不出来。别说代码了,中英文混血,就秒杀一大堆高干分子。 public class HelloWorld { public static void main(String[] args) { System.out.println("love xjjdog"); } } 想说爱我就那么难么?怎么这么多的废话呢?这次探讨的主要问题是,给Java源文件加个空行之后,它生成的字节码,会有变化么? 1. 翻脸不认人 Java号称一次编译到处运行,大概就是class文件的功劳。不同的Java版本编译之后的class文件那是肯定不一样的,因为里面有一个版本号,那肯定影响了它们的内容。 我们就看一下,如果给上面的代码,加一个空行,它的class文件会不会变。 这个空行还不能随便加。它可能在xjjdog上面,也可能在下面。可能在{中,也可能在文件末尾。 (1) 打脸 在验证之前,我们先看一下当前的class文件md5值。 我非常喜欢被打脸,所以先看一种加空行也无所谓的情况。 再次编译之后看md5值,果然被打脸了。还好我已经练就了脸不红心不跳的本领,这个结果厚着脸皮接受。 (2) 抹药 为了和主题遥相呼应,安慰一下受伤的心灵,我们把空行转移到了这里。

浅谈JVM

こ雲淡風輕ζ 提交于 2020-02-27 14:20:27
注:本文虽然讨论的是方法区,但是为了解答某些问题也涉及到了Class文件结构和类加载的相关知识 java7及以前,方法区的实现是永久代,java8以后,方法区的实现是元空间 6.1 定义 方法区是java虚拟机规范中定义的一种概念上的区域,不同的厂商可以对虚拟机进行不同的实现。 方法区与堆有很多共性:线程共享、内存不连续、可扩展、可垃圾回收,同样当无法再扩展时会抛出OutOfMemoryError异常。 6.2 组成 6.3 方法区内存溢出 java7及以前,使用 -XX:MaxPermSize 限制永久代的最大内存,当加载大量的类时,会抛出 java.lang.OutOfMemoryError:PermGen space 异常,永久代内存不足时会触发FullGC java8以后,使用 -XX:MaxMetaspaceSize 限制元空间的最大内存,当加载大量的类时,会抛出 java.lang.OutOfMemoryError:Metaspace 异常,元空间内存不足时会触发FullGC 示例代码(采用jdk1.8,增加限制 -XX:MaxMetaspaceSize=100m ) public class MetaspaceDemo extends ClassLoader{ public static void main(String[] args) { // 类持有 List

Long类型数值比较及反汇编分析源码

霸气de小男生 提交于 2020-02-27 04:48:29
一、问题描述 开发过程中遇到如下问题 Long a = 100L; Long b = 100L; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(a == 100); System.out.println(a.equals(100)); 输出结果: true true true false 但是当Long类型大于127时: Long a = 128L; Long b = 128L; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(a == 128); System.out.println(a.equals(128)); 输出结果: false true true false 二、问题分析 查看源码:java.lang.Long.java LongCache会预先缓存-128–127范围内的数,通过缓存频繁请求的值代来更好的空间和时间性能, 当数据超出此范围,则new一个Long对象; “==”是比较的地址,超出此范围的数据地址不一致,所以范围内的比较是true,范围外的数据是false; 而a==100则实现了类型的自动向上转换

不能用 + 拼接字符串? 这次我要吊打面试官!

北城余情 提交于 2019-12-23 09:56:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 好久没维护《 吊打面试官 》系列了,今天再来一篇,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复: 吊打 ,我会陆续更新……) 我们做 Java 程序员以来,不管是工作当中,还是面试过程中,都知道:字符串拼接不能用 String,要用 StringBuilder 或者是 StringBuffer ,以至于它们都被滥用了。 StringBuilder、StringBuffer 简称:SB,下文统一用 SB 代替。 SB 它们都是可变的字符串,它们之间的区别也是 Java 初中级面试战场上出现几率十分高的一道题,上场率没有 90% 也有 80% 吧。 这两个的具体区别请看这篇文章: StringBuffer 和 StringBuilder 的 3 个区别 。 我们反过来想下,String真的是不可变的么?不一定,看下这篇: Java 中的 String 真的是不可变的吗? 当然,本文不是讨论字符串可变与不可变的问题,而是讨论:字符串拼接一定要用 SB 吗?为什么不能用 + ?能不能用 + ?什么时候可以用 + ? 为什么不能用 + 号拼接字符串?我不服,接下来我要吊打面试官! 什么时候不能用 + 通过多个表达式完成一个字符串拼接操作。 private void test1() { String www =

Instrument API介绍

时光怂恿深爱的人放手 提交于 2019-12-21 18:56:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. Instrumentation介绍   JVMTI (JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,是 JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface)的更新版本。JVMTI 提供了一套“代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能。  Agent 即 JVMTI 的客户端,它和执行 Java 程序的虚拟机运行在同一个进程上。他们通常由另一个独立的进程控制,充当这个独立进程和当前虚拟机之间的中介,通过调用 JVMTI 提供的接口和虚拟机交互,负责获取并返回当前虚拟机的状态或者转发控制命令。java.lang.instrument 包的实现,也是基于这种机制的。在 Instrumentation 的实现当中,存在一个 JVMTI 的代理程序,通过调用 JVMTI 当中于 Java 类相关的函数来完成Java 类的动态操作。  利用 java.lang.instrument 做动态 Instrumentation 是 Java SE 5

蚂蚁金服 Service Mesh 落地实践与挑战 | GIAC 实录

落爺英雄遲暮 提交于 2019-12-12 13:45:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文整理自 GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)全球互联网架构大会,蚂蚁金服平台数据技术事业群技术专家石建伟(花名:卓与)的分享。分享基于 Service Mesh 的理念,结合蚂蚁金服内部实际场景,将中间件、数据层、安全层等能力从应用中剥离出来后下沉至独立的 Sidecar SOFAMosn 中,结合 Kubernetes 运维体系,提供应用无感知的情况下升级基础设施层能力的案例。 本次分享将从以如下次序展开进行: 蚂蚁金服当前的服务化现状 在看蚂蚁金服的服务化架构之前我们先从一个简单的服务化调用示例说起,下图是 SOFARPC 基本原理: 图1. SOFARPC 基本原理 我们从上图可以看出,构建一个服务化框架需要有服务注册中心,有服务定义,调用方和服务提供方使用相同的服务定义来互相通讯。通过服务注册中心,调用方可以直接订阅到服务提供方的地址,采用点对点的方式直接发起请求。客户端内可实现服务发现、路由寻址、负载均衡、限流熔断等能力来增强服务通讯能力。通过我们开源的 SOFARPC、SOFARegistry、SOFABoot,用户已经可以直接构建起微服务体系,助力业务发展。 蚂蚁金服发展至今,双 11 系统需要应对的交易洪峰逐年递增: 图2. 历年双 11

Class文件格式

▼魔方 西西 提交于 2019-12-09 11:55:34
 我们知道Java是一门跨平台的语言,我们编写的Java代码会被编译成中间class文件以让Java虚拟机解析运行。而Java虚拟机规范仅仅描述了抽象的Java虚拟机,在实现具体的Java虚拟机时,仅指出了设计规范。Java虚拟机的实现必须体现规范中的内容,但仅在确有必要时才应该受制于这些规范。对于完整内容,可以查看原文档,以JDK7为例,可查看 https://docs.oracle.com/javase/specs/jvms/se7/html/ ,或者《深入理解Java虚拟机 JVM高级特性与最佳实践》一书。完整的规范主要包含以下内容: 第2章:概览Java虚拟机整体架构 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集 第4章:定义class文件格式。它是一种与硬件和操作系统无关的二进制格式,用来表示编译后的类和接口 第5章:定义了Java虚拟机启动以及类和接口的加载、链接和初始化的过程 第6章:定义了Java虚拟机指令集 第7章:提供了一张以操作码值为索引的Java虚拟机操作码助记表  本文只是大概记录项目需要了解的基础概念,着重在介绍Class文件格式上,为该系列后续内容做铺垫。  Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分割符。每个 Class 文件都是由 8 字节为单位的字节流组成

Class文件格式

99封情书 提交于 2019-12-08 17:14:40
 我们知道Java是一门跨平台的语言,我们编写的Java代码会被编译成中间class文件以让Java虚拟机解析运行。而Java虚拟机规范仅仅描述了抽象的Java虚拟机,在实现具体的Java虚拟机时,仅指出了设计规范。Java虚拟机的实现必须体现规范中的内容,但仅在确有必要时才应该受制于这些规范。对于完整内容,可以查看原文档,以JDK7为例,可查看 https://docs.oracle.com/javase/specs/jvms/se7/html/ ,或者《深入理解Java虚拟机 JVM高级特性与最佳实践》一书。完整的规范主要包含以下内容: 第2章:概览Java虚拟机整体架构 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集 第4章:定义class文件格式。它是一种与硬件和操作系统无关的二进制格式,用来表示编译后的类和接口 第5章:定义了Java虚拟机启动以及类和接口的加载、链接和初始化的过程 第6章:定义了Java虚拟机指令集 第7章:提供了一张以操作码值为索引的Java虚拟机操作码助记表  本文只是大概记录项目需要了解的基础概念,着重在介绍Class文件格式上,为该系列后续内容做铺垫。  Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分割符。每个 Class 文件都是由 8 字节为单位的字节流组成