- 博客(20)
- 收藏
- 关注
原创 JVM笔记----JVM内存模型
一、JVM构成Java源代码编译成Java Class文件后通过类加载器ClassLoader加载到JVM中 类存放在方法区中 类创建的对象存放在堆中 堆中对象的调用方法时会使用到虚拟机栈,本地方法栈,程序计数器 方法执行时每行代码由解释器逐行执行 热点代码由JIT编译器即时编译 垃圾回收机制回收堆中资源 和操作系统打交道需要调用本地方法接口二、JVM内存模型Java代码执行过程如下图:其中的运行时数据区即为jvm内存模型,如图:2.1、运行时数据区存储的数据
2022-01-14 03:29:00 259
原创 JVM笔记----JVM调优
一、JVM调优概述1.1、何时需要做JVM调优heap 内存(老年代)持续上涨达到设置的最大内存值; Full GC 次数频繁; GC 停顿时间过长(超过1秒); 应用出现OutOfMemory 等内存异常; 应用中有使用本地缓存且占用大量内存空间; 系统吞吐量与响应性能不高或下降;1.2、JVM调优原则多数的Java应用不需要在服务器上进行JVM优化; 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题; 在应用上线之前,先考虑将机器的JVM参数设置到..
2022-01-14 02:58:16 401
原创 Java并发编程之有序性、原子性、可见性
一、原子性原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。下面通过一段代码来分析一下public class T01_Volatile { private boolean running = true; private void m(){ System.out.println("m start"); while (running){ } System.out.prin
2022-01-11 23:20:37 306
原创 JVM笔记----JAVA内存屏障
一、内存屏障(Memory Barrier) 简介程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。内存乱序访问主要发生在两个阶段:编译时,编译器优化导致内存乱序访问(指令重排) 运行时,多 CPU 间交互引起内存乱序访问Memory Barrier 是一个CPU指令。基本上,它是这样一条指令: a) 确保一些特定操作执行的顺序; b) 影响一些数据的可见性(可能是某些指令执行后的结果)。能够让 CPU 或
2022-01-11 22:17:12 611
原创 JVM笔记----class文件结构一
1、概述记得上第一堂计算机相关得课程时,老师曾说过:“计算机只认识0和1,所以我们写的程序需要被编译器翻译成由0和1构成的二进制格式才能被计算机执行。”尽管计算机发展了这么多年了,今天的计算机仍旧只能识别0和1。接下来我们就重点说一下Java得class文件。2、class文件结构class文件是一组亿字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在文件之中,中间没有添加任何分隔符,这就导致整个class文件中存储的几乎全是程序运行的必要数据,当遇到需要占用多个字节的数据项时,则按
2022-01-09 22:40:12 302
原创 Spring笔记----JDBCTemplate
一、JDBCTemplate概述为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一
2021-09-16 09:49:33 554
原创 Spring笔记----IOC
一、Spring概述Spring是一个开源的JavaEE的全功能栈的应用程序框架,Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。特点:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。轻量——从大小与开销两方面而言Spring都是轻量的。完整的Sp
2021-09-13 20:34:07 194
原创 哈希冲突和内存溢出
哈希冲突产生的原因哈希是通过对数据进行再压缩,提高效率的一种解决方法 ,但是通过哈希函数产生的哈希值是有限的,而数据的总量可能很大,这就导致总会有不同的数据拥有相同的哈希值,从而产生了哈希冲突。产生哈希冲突的影响因素填充比(填充比=数据总数/哈希表长)又叫加载因子,哈希函数,处理哈希冲突的算法。解决哈希冲突的四种方法1,开放地址法线性探测再散列法按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上往后加一个单位,直至不发生哈希冲突。二次平方再散列法按顺序决定...
2021-08-19 08:45:42 947
原创 线程池原理
一、为什么要使用线程池 降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。 二、ThreadPoolExecutor中一些参数详解参数 说明 corePoolSize 核心线程数量,线程池维护线程的最少数量 maximum..
2021-08-16 21:46:14 109
原创 深拷贝和浅拷贝的区别
首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对于对象或者引用数据来说在进行浅拷贝时,只是将对象的引用复制了一份,也就内存地址,即两个不同的变量指向了同一个内存地址,那么在改变任一个变量的值都是该变这个内存地址的所存储的值,所以两个变量的值都会改变。一、clone()方法在Java中是用clone()方法实现深拷贝的,比如以下代码在Jav
2021-08-16 20:43:04 46964 3
原创 关于Redis分布式锁
在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。加锁机制如果客户端面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器,然后发送一段lua脚本到redis上,脚本内容如下"if(redis.call('exis
2021-08-15 19:13:49 90
原创 Java中强引用,软引用,弱引用和虚引用的区别
一、概述我们都知道在Java中是由jvm负责内存的分配和回收,这让程序猿可以不用像C那用操心内存,但同时也存在不够灵活的缺点。在jdk1.2之前的版本中,当没有任何一个变量引用指向某个对象时,那么程序就再也无法使用该对象,也就相当于你只有一直持有你的手机,你才能使用你的手机,当你的手机丢了那么你就无法在使用这个手机。因为一般来讲当你的手机丢了,是很难找回来的。但实际情况并不会如此简单,就比如你家中,有些东西可能当时用不到,但是不代表这些东西就是无用的,再某一个时间可能就会需要用到这个东西,所以你
2021-08-04 18:27:23 224
原创 线程间的几种通信方式
短线程间的通信有两种模型:消息传递和内存共享,基本上的实现通信的方式都是基于这两种模型实现的一、使用volatile关键字基于volatile关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式public class TestSync { // 定义一个共享变量来实现通信,它需要是volatile修饰,否则线程不能及时感知 public volatile static..
2021-08-03 20:07:38 356
原创 MySql存储两种存储引擎的区别
MySql的两种引擎分辨是MyISAM和InnoDB,在MySql5.1版本之前的默认引擎是MyISAM,而之后的版本默认引擎就是InnoDB。MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据
2021-07-14 20:58:00 2367
原创 JavaSe笔记----泛型中的协变与逆变
一、协变与逆变的概念协变与逆变是用来描述类型转换后的继承关系:A、B表示类型,f()表示类型转换,A<=B表示A是B的子类,那么则有如下关系:f()表示协变:当A<=B时,则f(A)<=f(B)成立f()表示逆变:当A<=B时,则f(A)>=f(B)成立f()表示不变:当A<=B时,则f(A)与f(B)没有继承关系二、数组的协变我们假设有三个类:动物,猫,狗,其中动物为父类,猫和狗为动物的两个子类在Java中子类是可以把引用指向父类的,则如下代
2021-07-09 20:49:10 154
原创 JAVASE笔记类加载顺序
java在执行程序时其加载顺序是固定,大致上的优先级可分为静态代码块-->代码块-->构造方法所以,一般来讲在类加载时先执行其静态代码块,在执行代码块,最后才是构造方法。但在有继承关系是其加载顺序为父类的静态代码块 子类的静态代码块 父类的代码块 父类的构造方法 子类的代码块 子类的构造方法注意:静态代码块只执行一次,不会重复加载需要注意静态的变量的位置 如果他在静态代码块之前 则先加载如果在静态的变量之后 则按照静态代码的顺序来执行如果有静态变量 .
2021-05-23 17:28:48 142
原创 JAVASE笔记---设计模式:单例模式
首先,设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。设计模式总共有23种之多,这里就是单例模式中的内容。1、单例模式的定义及特点单例(Singleten)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一.
2021-05-23 17:14:57 153
原创 网页前端设计一般思路
一、需求分析在进行网页前端开发时,首先需要的就是进行需求分析,只有在做好了需求分析后,才能做出一份比较完善的一份东西,做出的网页也才能更符合客户的预期二、设计总体布局在完成了需求分析后,就需要对网页的布局做一个总体的布局,每一个网站,其所属的网页的 在大体布局上应该是一致的,这样整个网站看起来才比较美观三、设计细节和具体实施设计完总体布局后,需要对每个子页面的具体细节进行细化,之后就是敲代码的环节,将自己的想法实现出来...
2021-05-09 22:02:23 3000
原创 HTML基础
HTML基础一、什么是HTMLhyper makeup language-----超文本标记语言,是一个纯文本文件且不区分大小写,即html和HTML都是一样的。二、HTML的文档结构<!DOCTYPE html> 文档类型 html ----MIME类型<html lang="en"> language=“en” zh-cn 属性节点<head> <meta charset="UTF-8"> 源 编码字符集----utf-8
2021-04-25 19:58:06 323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人