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 ...
jvm基础1之内存与垃圾回收篇
jvm基础1为什么要学习jvm
面试
系统调优
JVM与Java体系结构前言作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?
运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!
想解决线上JVM GC问题,但却无从下手。
新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就gg了
每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。
大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。
一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言
架构师每天都在思考什么?
应该如何让我的系统更快?
如何 ...
java代理模式值proxy和cglib
1. 代理模式代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。
举个例子:你找了小红来帮你问话,小红就可以看作是代理你的代理对象,代理的行为(方法)是问话。
https://medium.com/@mithunsasidharan/understanding-the-proxy-design-pattern-5e63fe38052a
代理模式有静态代理和动态代理两种实现方式,我们 先来看一下静态代理模式的实现。
2. 静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的(_后面会具体演示代码_),非常不灵活(_比如接口一旦新增加方法,目标对象和代理对象都要进行修改_)且麻烦(需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。
上面我们是从实现和应用角度来说的静态代理,从 J ...
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安全管理器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基础-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基础-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基础-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基础-1
概述Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。
Java 反射机制功能强大而且非常实用。目前在互联网上已经有不胜枚举的 Java 反射指南,然而大多数的指南包括 Sun 公司所发布的反射指南中都仅仅只是介绍了一些反射的表面内容以及它的潜能。
在这个系列的文章中,我们会比其他指南更深入的去理解 Java 反射机制,它会阐述 Java 反射机制的基本原理包括如何去使用数组,注解,泛型以及动态代理还有类的动态加载以及类的重载的实现。同时也会向你展示如何实现一些比较有特性的功能,比如从一个类中读取所有的 get/set 方法,或者访问一个类的私有变量以及私有方法。
在这个系列的指南中同时也会说明一些非反射相关的但是令人困惑的问题,比如哪些泛型信息在运行时是有效的,一些人声称所有的泛型信息在运行期都会消失,其实这是不对的。
类使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在 ...
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为给定接口创建模拟对象.模拟对象只不过是实际实现的代理.
考虑一个股票服务案 ...
Junit单元测试
Junit单元测试一、什么是单元测试?
在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。简单来说,就是测试数据的稳定性是否达到程序的预期。
二、单元测试的重要性
谈到测试,我们为什么要对程序进行测试呢?测试会为程序带来什么好处呢?
首先,我们每个人都会犯错误。毕竟人嘛,没有完美的谁谁谁。在程序中犯错误就像生活中犯错一样,错误不是一天两天而形成的。当需要改的时候,也不是能花少的时间而改掉的。这里我谈到的程序中的错误,就是著名的Bug。
我们可能在不经意间写错,如果你到了最后阶段去检验项目成果时,发现会有错误,这时候我们很难找到Bug的源头在哪里。我们都知道,有可能一处出错会导致步步错的情况。
然而,测试就在我们的上述说法中,显得尤为重要。有了测试的概念,这时候当我们做完项目的一个小模块,我们先去测试一下这个小模块是否正确或达到预期,如果错误或者没有达到预期就需要反复修改,直到正确或达到预期。这里所说的也就是使用了单元测试。
当我们一块一块的做完并一块一块的测试 ...
springMVC
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
拦截器是基于java的反射机制的,aop实现,可以在方法前后,而过滤器是基于函数回调,需要在web.xml中配置。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器可以多次被调用,还可以访问当前作用于的栈和对象,可以详细到每个方法,而过滤器器只能在请求的前后过滤
过滤器能够修改reques,而拦截器不行
Filter的执行顺序在Interceptor之前,具体的流程见下图
也就是
过滤器:能够拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息
拦截器:可以拿到你请求的控制器和方法,拿不到请求方法的参数
spring核心知识点
说一下spring ioc的理解,原理和实现总ioc:控制反转。原来的对象是由使用者来控制的,有了spring,就直接把整个对象交给spring来帮我们管理。
DI:依赖注入。把对应的属性的值注入到具体的对象中,@autowired,populatebean完成属性值得注入
容器:存储对象,使用map结构存储,在spring中一般存在三级缓存,singletonOBjects存放文章的bean对象,在整个bean的生命周期中,从创建到使用到销毁都是由容器来管理的。
分IOC和DI举一个例子:有车,底盘,轮胎,在没有spring之前,我们相对这样的整体架构进行设计,一个常用的方法就是通过构造器注入,我们在创建一个底盘的时候,需要new一个轮子的对象,把这个对象的尺寸,材料设置好后,通过底盘的构造器放入底盘中。同样,我们在最终创建一个车的时候,需要先创建一个轮胎对象,在创建一个底盘对象,最后才能创建出我们想要的车的对象。然后spring就帮我解决了这样的而问题,你可以直接去创建一个车的对象,而具体的底盘和轮胎的对象注入,由spring自己来进行,你只需要在开始创建这样的bea ...