关于JVM和Java的一些基础
结合jvm笔记和java底层笔记
一、Java中JRE JVM JDK的区别
JVM:Java虚拟机,是整个Java实现跨平台的最核心部分 编译.class文件
JRE:Java运行环境 仅有JVM不能执行.class 解释class时JVM需调用解释类库lib ,里面有bin和lib 可以认为bin就是jvm jvm和lib合起来成为JRE
JDK:jdk真正运行Java时起作用的是bin include lib jre
bin:最主要的是编译器
include:Java和JVM交互用的头文件
lib:类库
jre:Java运行环境
总结:正常运行程序只需要jre就够 如果要编译运行Java程序就需要jdk bin目录下编译工具
二、Java缓存机制Cache
缓存:将程序或系统经常要调用的对象存在内存中,可在使用时进行快速调用,不必创建新的重复的实例。这样做可以减少系统开销,提高效率
两大分类:
1.通过文件缓存,数据存储在磁盘上 不管是一XML格式,序列化文件DAT格式或者其他格式;
2.内存缓存,也就是实现一个类中静态Map 对这个Map进行常规的增删改
代码另一个文件
三、Redis缓存
作用:通过redis缓存数据 目的是减少数据库的负担不是加快查询速度
解释:redis是一个key-value存储系统。和Memcached类似 它支持存储的value类型相对较多,包括string list set zset(有序集合) hash。 这些操作都是原子性的 在此基础上 redis支持各种不同的排序方式 和memcached一样 为了保证效率 数据缓存在内存中 。最大区别是redis会周期性的吧更新的数据写入磁盘或者把修改操作写入追加的记录文件,并在此基础上实现了maste-slave(主从)
redis缓存数据 内存占满解决办法:
1.加内存
2.搭建集群
3.缩短数据过期时间 以释放内存
四、SpringMVC(是一种设计模式)
MVC设计思想:MVC即Model-View-Controller 把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离、这样一个应用被分成三个层——模型层、视图层、控制层
MVC是一种复合模式,结合了观察者模式、策略模式、组合模式、适配器模式。
模型使用观察者模式,一遍观察者更新,同时保持两者之间的解耦。
控制器是视图的策略,视图使用组合模式实现用户界面。
适配器模式用来将模型适配成符合现有视图和控制器的需要的模型
这些模式合作把MVC模式的三层解耦。
视图层:代表用户交互界面,对于Web应用,可以是HTML 也可能是jsp、XML和Applet。一个应用有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,二不包过在视图上的雨雾流程的处理。业务流程的处理交于模型层(model)处理。
它只是作为一种输出数据并允许用户操纵的方式
模型类:是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计师MVC最主要的核心。MVC设计模式告诉我们 把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重要性。
业务模型还有一个很重要的模型那就是数据模型。数据类型主要是指实体对象的数据保存(持续化)
减少了代码的重复性
控制层:是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据
MVC分层有助于管理复杂的应用程序,因为可以在一个时间内只关注一个方面
MVC分层同时也简化了分组开发,不同的开发人员可同时开发视图、控制器逻辑和业务逻辑
MVC最典型的就是 JSP+servlet+javabean模式
五、session与cookie的区别
cookie 存在客户端(客户的浏览器) 不安全 内存大小有限制
session 数据放在服务器 在一定时间内保存在服务器(访问增多时会清除session缓存 建议用cookie) 单个cookie保存数据不能超过4k (大多数浏览器限制一个站点最多保存20个cookie)
个人建议 登录信息扥重要信息放入session
其他信息如果需要保留 可以放cookie
(jsp动态 底层servlet->Java代码经过JVM进行编译)
六、SSH与SSM的区别
定义:
SSH:Struts2做控制器(controller),spring管理各层的组件,hibernate负责持久化。
SSM:SpringMVC做控制器,spring管理各层的组件,Mybatis负责持久化层
共同点:1.spring依赖注入DI来管理各层的组件
2.使用面向切面AOP管理事务、日志、权限
不同点:1.Struts2和SpringMVC控制器(Controller)控制视图和模型的交互机制不同
2.Struts2是Action类级别 SpringMVC是方法级别,更容易实现RESTful风格
冗余
主键与外键再多表中的重复出现,不属于数据冗余(谨记*) 非键字段的重复出现才是数据冗余,而且是低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。例如:单价、数量、金额三个字段,金额就是由单价*数量派生出来的,是高级冗余
冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,以为同一数据,可能从不同的时间。地点。角色上多次录入。因此我们提倡高级冗余(派生性冗余),反对低级冗余。
解耦合
耦合是一个宽泛的概念。两个程序模块有关联叫做耦合
某些模块必然要关联起来才能工作,这是由业务逻辑决定的,不能否认。所以解耦并不是字面意义上的把关联拆掉,而是把模块之间的关联放松到必要的程度。Advices:
.模块只对外暴露最小限度的接口,形成最低的依赖关系
.只要对外接口不变,模块内部的修改,就不得影响其他模块
.删除一个模块,应当只影响有依赖关系的其他,而不应该影响其他无关部分
软件工程有一条铁律“高内聚,低耦合”必要的耦合不可否认,没有耦合程序就做不成事;但是不必要的紧耦合就会让程序“牵一发而动全身”,最终让程序员的编写和维护都无从下手
“高内聚,低耦合”就是为了满足让人类在同一时间只能专注一小部分的内容
异步同步
要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(同步)(或 volatile 易改变的)以确保一个线程可以看见另一个线程做的更改。
为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的。
为了达到这个目的,java在一个旧的的进程同步模型——监控器(Monitor)的基础上实现了一个巧妙的方案:监控器是一个控制机制,可以认为是一个很小的、只能容纳一个线程的盒子,一旦一个线程进入监控器,其它的线程必须等待,直到那个线程退出监控为止。通过这种方式,一个监控器可以保证共享资源在同一时刻只可被一个线程使用。这种方式称之为同步。(一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用)。
错误的理解:同步嘛,就是几个线程可以同时进行访问。
同步和多线程关系:没多线程环境就不需要同步;有多线程环境也不一定需要同步。
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。
互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。
可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题
小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是所谓的:线程安全。如java集合框架中Hashtable和Vector是线程安全的。我们的大部分程序都不是线程安全的,因为没有进行同步,而且我们没有必要,因为大部分情况根本没有多线程环境)。
线程and进程
1、实现多线程的方法(四种)
2、(线程安全?)java中实现同步的方式(synchronized/Lock)
3、用过java.util.concurrent(java并发包下的哪些类)
a.Lock(ReentranLock,ReadWriteLock//读写锁)
4、volatitle关键字
5、你在项目中的那些地方运用了多线程
6、线程池
7、JMM(java内存模型)
8、sleep和wait的区别
23种计模式 共分为3大类:
创建型模式 5种:工厂方法模式 抽象工厂模式 单例模式 建造模式 原型模式
结构型模式 共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、 组合模式、享元模式
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
上一篇: C语言函数学习