源码级别理解java拆箱装箱过程
题目知道字节码吗,字节码都有哪些?比较下面代码x == y都经过了哪些过程
1234567public class interview { public static void main(String[] args) { Integer x = 5; int y = 5; System.out.println(x == y); }}
正确答案:
1true
通过idea的工具jClasslib插件查看main方法的code,发现:
然后我们去Integer中查看Valueof和intValue方法
valueOf123public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10));}
1234567public static Integer valueOf(int i) { // ...
jvm基础3之性能监控与调优篇
jvm基础3之性能监控与调优篇
概述篇大厂面试题
支付宝:
支付宝三面:JVM 性能调优都做了什么?
小米:
有做过 JVM 内存优化吗?
从 SQL、JVM、架构、数据库四个方面讲讲优化思路
蚂蚁金服:
JVM 的编译优化
jvm 性能调优都做了什么
JVM 诊断调优工具用过哪些?
二面:jvm 怎样调优,堆内存、栈空间设置多少合适
三面:JVM 相关的分析工具使用过的有哪些?具体的性能调优步骤如何
阿里:
如何进行 JVM 调优?有哪些方法?
如何理解内存泄漏问题?有哪些情况会导致内存泄漏?如何解决?
字节跳动:
三面:JVM 如何调优、参数怎么调?
拼多多:
从 SQL、JVM、架构、数据库四个方面讲讲优化思路
京东:
JVM 诊断调优工具用过哪些?
每秒几十万并发的秒杀系统为什么会频繁发生 GC?
日均百万级交易系统如何优化 JVM?
线上生产系统 OOM 如何监控及定位与解决?
高并发系统如何基于 G1 垃圾回收器优化性能?
背景说明生产环境中的问题
生产环境发生了内存溢出该如何处理?
生产环境应该给服务器分配多少内存合适?
如何对垃圾回收器的性能进行调优?
生产环境 C ...
jvm基础2之字节码与类的加载篇
jvm基础2概述字节码文件的跨平台性Java语言:跨平台的语言(write once,run anywhere
当Java源代码成功编译成字节码后,如果想在不同的平台上运行,则无须再次编译
这个优势现在不在那么吸引人
Python、PHP、Perl、Ruby、LISP等都有强大的解释器
跨平台似乎快成为了一门语言必选的特性。
Java虚拟机:跨语言的平台
Java虚拟机不和包括Java在内的任何语言绑定,它只和“class文件”这种特点的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译成正确的Class文件,那么这种语言就可以在Java虚拟机上运行。可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁。
java文档说明:https://docs.oracle.com/javase/specs/index.html
我们主要是查看java8:
https://docs.oracle.com/javase/specs/jls/se8/html/index.html
https://docs.oracle.com/javase/sp ...
jvm基础1之内存与垃圾回收篇
jvm基础1为什么要学习jvm
面试
系统调优
JVM与Java体系结构前言作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?
运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!
想解决线上JVM GC问题,但却无从下手。
新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就gg了
每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。
大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。
一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言
架构师每天都在思考什么?
应该如何让我的系统更快?
如何 ...
Jvm基础4之案例篇
调整堆大小提高服务的吞吐量修改tomcat jvm配置初始配置setenv.sh文件中写入(大小根据自己情况修改): setenv.sh内容如下:
12345678export CATALINA_OPTS="$CATALINA_OPTS -Xms30m"export CATALINA_OPTS="$CATALINA_OPTS -XX:SurvivorRatio=8"export CATALINA_OPTS="$CATALINA_OPTS -Xmx30m"export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseParallelGC"export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDetails"export CATALINA_OPTS="$CATALINA_OPTS -XX:MetaspaceSize=64m"export CATALINA_OPTS="$CATALINA_OP ...
java代理模式值proxy和cglib
1. 代理模式代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。
举个例子:你找了小红来帮你问话,小红就可以看作是代理你的代理对象,代理的行为(方法)是问话。
https://medium.com/@mithunsasidharan/understanding-the-proxy-design-pattern-5e63fe38052a
代理模式有静态代理和动态代理两种实现方式,我们 先来看一下静态代理模式的实现。
2. 静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的(_后面会具体演示代码_),非常不灵活(_比如接口一旦新增加方法,目标对象和代理对象都要进行修改_)且麻烦(需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。
上面我们是从实现和应用角度来说的静态代理,从 J ...
java安全管理器SecurityManager
java安全管理器SecurityManager一、文章的目的这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题。
比如在阅读源码的时候,发现这样的代码,想了解是做什么的:
1234SecurityManager security = System.getSecurityManager();if (security != null) { security.checkWrite(name);}
亦或者在本机运行正常,在服务器运行报错,想解决问题:
1234567Exception in thread "main" java.security.AccessControlException: access denied (java.lang.RuntimePermission createSecurityManager) at java.security.AccessControlContext.checkPermission(AccessControlCon ...
java深拷贝与浅拷贝
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。举例说明:比如,对象A和对象B都属于类S,具有属性a和b。那么对对象A进行拷贝操作赋值给对象B就是:B.a=A.a; B.b=A.b;
在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用现有对象的部分或全部 数据。
Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。
先介绍一点铺垫知识:Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时,会有值传递和引用(地址)传递的差别。
浅拷贝(Shallow Copy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。②对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址) ...
无题
java基础一个Java文件写多个类,编译的结果是几个class写几个类就是几个class,内部类还是在外部的class中
Java初始化一个类的步骤java层面如果不涉及到jvm层面,那么主要想问的的有父类的情况下,静态变量、代码块、构造方法的执行顺序
1234561. 父类的静态对象和静态代码块(先声明的先执行)2. 子类的静态对象,静态代码块((先声明的先执行))3. 父类的全局变量代码的初始化4. 父类的构造方法(子类的构造方法中会隐式或显示调用父类的构造方法,如果父类只有private的构造方法,子类的构造方法会报错,如果父类没有父类则不会调用super方法)5. 子类全局变量的初始化6. 子类的构造方法
jvm层面如果想问的的是jvm层面,那么需要设计到类的加载机制和对象分配
什么时候需要初始化:主动使用:
实例化:创建一个类的实例时,比如使用new关键字,或者通过反射、克隆、反序列化
静态方法:当调用类的静态方法的时候,即使用了字节码invokestatic指令
静态字段:当使用类、接口的静态字段时(final static修饰的在编译的时候已经确定了),比如 ...
java基础-4之集合深入
ArrayList1. ArrayList 简介ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
ArrayList继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。
1234public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ }
RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。
ArrayList ...
java基础-3集合面试题
Java集合框架基础知识&面试题总结集合概述Java 集合概览Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collecton接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。
Java 集合框架如下图所示:
注:图中只列举了主要的继承派生关系,并没有列举所有关系。比方省略了AbstractList, NavigableSet等抽象类以及其他的一些辅助类,如想深入了解,可自行查看源码。
说说 List, Set, Queue, Map 四者的区别?
List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。
Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),”x” 代表 key,”y” 代表 value,key 是无序 ...
java基础-1
概述Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。
Java 反射机制功能强大而且非常实用。目前在互联网上已经有不胜枚举的 Java 反射指南,然而大多数的指南包括 Sun 公司所发布的反射指南中都仅仅只是介绍了一些反射的表面内容以及它的潜能。
在这个系列的文章中,我们会比其他指南更深入的去理解 Java 反射机制,它会阐述 Java 反射机制的基本原理包括如何去使用数组,注解,泛型以及动态代理还有类的动态加载以及类的重载的实现。同时也会向你展示如何实现一些比较有特性的功能,比如从一个类中读取所有的 get/set 方法,或者访问一个类的私有变量以及私有方法。
在这个系列的指南中同时也会说明一些非反射相关的但是令人困惑的问题,比如哪些泛型信息在运行时是有效的,一些人声称所有的泛型信息在运行期都会消失,其实这是不对的。
类使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在 ...
java基础-2
BigDecimalBigDecimal 介绍BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。
那为什么浮点数 float 或 double 运算的时候会有精度丢失的风险呢?
这是因为计算机是二进制的,浮点数没有办法用二进制精确表示。
BigDecimal 的用处《阿里巴巴Java开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。 具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例:
12345float a = 1.0f - 0.9f;float b = 0.9f - 0.8f;System.out.println(a);// 0.100000024System.out.println(b);// 0.099999964System.out.println(a == b);// false
具有基本数学知识的我们很清楚的知道输出并不是我们想要的结果(精度丢失),我们如何解决这个问题呢?一种很常用的方法是:使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。
1234567 ...
java基础-1
Java 语言有哪些特点?
简单易学;
面向对象(封装,继承,多态);
平台无关性( Java 虚拟机实现平台无关性);
支持多线程(C++11 开始(2011 年的时候),C++就引入了多线程库,在 windows、linux、macos 都可以使用std::thread和std::async来创建线程。);
可靠性;
安全性;
支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
编译与解释并存;
JVM vs JDK vs JREJVMJava 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 ...
Mockito单元测试
https://www.it1352.com/OnLineTutorial/mockito/mockito_overview.html
https://www.cnblogs.com/zishi/p/10537967.html
概述什么是Mocking?模拟是一种独立测试类功能的方法.模拟不需要数据库连接或属性文件读取或文件服务器读取来测试功能.模拟对象可以模拟真实服务.模拟对象返回与传递给它的一些虚拟输入相对应的虚拟数据.
为什么要有Mockito我们项目一般都是 MVC 分层的,而单元测试主要是在 Dao 层和 Service 层上进行编写。从项目结构上来说,Service 层是依赖 Dao 层的,但是从单元测试角度,对某个 Service 进行单元的时候,他所有依赖的类都应该进行Mock。而 Dao 层单元测试就比较简单了,只依赖数据库中的数据。对于大量这样的mock数据,我们使用mockito可以方便我们的开发。
MockitoMockito有助于无缝地创建模拟对象.它使用Java Reflection为给定接口创建模拟对象.模拟对象只不过是实际实现的代理.
考虑一个股票服务案 ...