JVM的一些问题
一、 JVM的内存划分 二、 JAVA类加载的全过程是怎样的?什么是双亲委派机制?有什么作用?一个对象从加载到JVM,再到被GC清除,都经历了什么过程?JAVA的类加载器: AppClassLoader->ExtClassloader -> BootStrap Classloader 每种类加载器都有他自己的加载目录 JAVA中的类加载器:AppClassLoader , ExtClassLoader -> URLClassLoader -> SecureClassLoader -> ClassLoader 每个类加载器对他加载过的类,都是有一个缓存的 双亲委派模型:向上委托查找,向下委托加载。 作用:保护Java的类不会被应用程序覆盖 类加载过程: 类加载过程: 加载 -> 连接 -> 初始化 加载: 把Java的字节码数据加载到JVM内存当中,并映射成JVM认可的数据结构。 连接:分为三个小的阶段: 1、 验证:检查加载到的字节信息是否符合JVM规则 2、 准备:创建类或者接口的静态变量,并赋初始值 半初始化状态 3、 解析:把符...
从i++的线程安全问题,分析volatile
看看如下代码 123456789101112131415161718192021222324package com.wzl.day26;/** * @ClassName VolatileVisibility * @Description VolatileVisibility * @Author wuzhilang * @Date 2021/1/10 17:09 * @Version 1.0 */public class VolatileVisibility { public static volatile int i = 0; public static void increase(){ i++; } /** * 在并发场景下,i变量的任何改变都会立马反应到其他线程中,但是如此春仔多条线程同时调用increase()方法的话,就会出现线程安全问题,毕竟i++;操作 * 并不具备原子性,该操作是先取值,然后写回一个新值,相当于原来的值上加1,分两步完成如果第二个下城在第一个编程读取旧值和写会新值期间...
双冒泡语法
1234567* 双冒号语法* 1.静态方法引用(static method)语法:classname::methodname 例如:Person::getAge* 2.对象的实例方法引用语法:instancename::methodname 例如:System.out::println* 3.对象的超类方法引用语法: super::methodname* 4.类构造器引用语法: classname::new 例如:ArrayList::new* 5.数组构造器引用语法: typename[]::new 例如: String[]:new*/
设计模式2工厂模式
模式定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 简单工厂的模式样例应该是如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152package com.wzl.design.factory;/** * @ClassName SimpleFactory * @Description SimpleFactory * @Author wzl * @Date 2020/11/16 20:47 *///简单工厂public class SimpleFactory { public static Product createdProduct(String type) { if (type.equals("0")) { return new ProductA(); } else...
设计模式1单例模式
模式定义: 保证一个类只有 一个示例,并且提供一个全局访问点 场景: 重量级的对象,不需要多个实例,如线程池,数据库连接池。 懒汉模式:延迟加载,只有在真正使用的时候,才开始实例化。 1)线程安全问题 2)double check 加锁优化 编译器(JIT),CPU有可能对指令进行重排序,导致使用到尚未初始化的实例, 可以通过添加volatile关键字进行修饰,对于volatile修饰的字段,可以防止指令重排 如果我们这样写的话: 12345678910111213141516171819202122232425262728293031package com.wzl.design.lazysingleton;/** * @ClassName LazySingletonTest * @Description LazySingletonTest * @Author wzl * @Date 2020/11/15 17:35 */public class LazySingletonTest { public static void main(String[] arg...
手撸IOC框架
IOC遵循是Spirng中对依赖倒转原则的原则,依赖倒转原则告诉我们: 上层模块不应该依赖底层模块,他们都应该依赖于抽象 抽象不应该依赖于细节,细节应该依赖于抽象 先读取bean的XML配置文件,然后使用beanId查找bean配置,并获取配置文件中class地址,得到地址后使用Java反射技术实例化对象,最后获取属性配置,使用反射技术进行赋值。详细步骤: 利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象 对于Document对象获取根元素对象后对下面的标签进行遍历,判断是否有符合的id.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象. 遍历标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理. 如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.返回建立的对象,如果没有对应...
pow(x,n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。 Related Topics数学二分查找\n👍 533👎 0 第一种解法:快速幂+递归 12345678910111213public double myPow(double x, int n) { int N = n; return n >= 0 ? quickMUl(x, N) : 1.0/quickMUl(x, N);}...
线程池代码
代码的注释都写在了这里 1. 线程的生命周期ExecutorService主要功能 1234567891011121314151617181920212223242526272829303132333435363738/** * 履行Ruannable类型的任务 * @param command */ void execute(Runnable command); /** * 可用来提交Callable或Runnable任务,并返回代表此任务的Future * 对象 * @param task * @param <T> * @return */ <T> Future<T> submit(Callable<T> task); /** * 在完成已提交的任务后封闭办事,不再接管新任务 */ void shutdown(); /** * 停止所有正在履行的任务并封闭办事。 * @return */ List<Runnable> shutdownNow(); /** * 测试是否所...
JVM的类加载过程(1)
当我们执行java命令的时候,java命令是怎么执行的呢。 12345678910111213141516171819202122232425package com.wzl.jvm.math;/** * @ClassName Math * @Description Math * @Author wuzhilang * @Date 2020/8/15 18:36 * @Version 1.0 */public class Math { public static final int initData = 666; public static User user = new User(); public int compute() { //一个方法对应一块栈帧内存区域 int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) {...