乱七八糟的记录

                                                                                笔记
    web.xml的配置文件中要有
        <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这是spring的监听器,没有会找不到@resource的注入(不影响项目服务器的启动)
可以在web.xml中配置项目开始时的进入页面或者action,直接执行action可以使页面进入时便有数据。
    <a>标签href跳转可以直接提交.action或href="javascript:void(0);"+方法;(.action?参数)可以
直接提交参数,在后台controller中将数据放入session(modle)中,直接返回页面名字,在页面使用
jstl表达式取出,controller方法不加@ResponseBody(会找不到页面)。
    阅读数量的记录方法:可以在数据库中建立日志表,记录时间,IP等等,使用insert插入,在需要时
可以根据标记使用count(*)的sql查询
    元素溢出的属性 ovreflow(防止元素重叠)
    在页面内部跳转方法:
1.    可以使用<a href="#命名锚"> 对应的要标记<div id="命名">(同时可以作为返回顶部的按钮)jsp中有basePath的时候,锚点定位易出错,会在锚点前加上basePath的地址,然后在寻找锚点,这时容易出现返回项目首页在寻找锚点的错误
2.    使用js跳转 <a href="" οnclick="function; return false;">当返回false时,超链接不跳转,function可以document.getElementById(id).scrollIntoView();
3.    可以为超链接绑定单机事件
    表单的ajax提交,需要导入jquery-form.js才可使用,在使用时可能会发生重复提交现象,可以在ajax提交时不添加data(不知道是否好使),
还可以正常ajax提交,但是加上async: false,使其成为异步提交。
    点击返回上一页面:history.back(-1);可以在方法,按钮或者超链接中使用,在超链接中使用时:JavaScript:history.back(-1);
    CSS中<a>标签的样式可以使用hover来改变,这是鼠标悬停时的样式变换。
    <li>的并排显示:设置样式为float: left; width: 25%; overflow:hidden; text-overflow : ellipsis; white-space:nowrap;根据需要调整。
    使用Tomcat6的时web.xml配置的<welcome-file>要在根目录下配置一个同名的页面或者action,可以在其中写需要的代码,否则可能找不到启动页面。
    Tomcat数据库的数据源配置<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
                        <property name="jndiName" value="jdbc/oracleds" />(java:comp/env在使用时在web.xml中添加映射)
                        <!-- 让spring加载jndi配置 -->
                     <property name="resourceRef" value="true" />
                        </bean>
    前端传值到后台发生中文乱码的现象:可以在Tomcat服务器的context.xml中配置相应端口的中文编码为UTF-8,还可以使用xxx.getBytes("iso8859-1"),"utf-8"的方法(每个参数都要使用这种方法)
    confirm():可以显示一个带有确定及取消选项的对话框。此方法可以节省很多动作!
document.onclick = function(){}   该方法为任意点击事件,点击页面即可执行(可能会不生效)
事件传播有两种方式:冒泡和捕获
冒泡事件流
当事件在某一DOM元素被触发时,例如用户在客户名字节点上点击鼠标,事件将跟随着该节点继承自的各个父节点冒泡穿过整个的DOM节点层次,直到它 遇到依附有该事件类型处理器的节点,此时,该事件是onclick事件。在冒泡过程中的任何时候都可以终止事件的冒泡,在遵从W3C标准的浏览器里可以通 过调用事件对象上的stopPropagation()方法,在Internet Explorer里可以通过设置事件对象的cancelBubble属性为true。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。
捕获事件流
事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会被从文档 根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何 元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。
mybitis:在出现多个参数修改并且关系为or时,可以使用
<foreach collection="" item="" open="(" separator="," close=")">
#{}
</foreach>
nvl(,)可以为符合条件的字段赋值
其等同于  字段 in (.,.) 这种sql写法
    注解
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
1、 value, method;
value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method:  指定请求的method类型, GET、POST、PUT、DELETE等;
@RequestMapping(value = {"list", ""})请求地址可以是list或者为空
2、 consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、 params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@Resource
@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Transactional
Spring事务的传播行为
在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked,如果遇到checked意外就不回滚。
如何改变默认规则:
1.    让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2.    让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3.    不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。
各种属性的意义:
REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。
NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。
REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。
MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。
NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
@controller
1:spring mvc 中将  controller  认为是 MVC中的C --控制层
2:规范命名 类名  xxxController
3:如果不基于注解:   该类需要继承  CommandController   或者 其他很多 参见  spring帮助如果基于注解:在类名前  加上@controller
4:补充:将类名前加上该注解,当spring启动  或者web服务启动  spring会自动扫描所有包(当然,这个可以设置)
作用:  就是告诉服务器  这个类是MVC中的C    这个类可以接收用户请求    处理用户请求。
@RequestBody
作用:
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机:
A)    GET、POST方式提时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B)    PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 必须;
multipart/form-data, 不能处理;
其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。


JVM:
1.    内存区域:程序计数器,java虚拟机栈(局部变量表),本地方法栈,(java堆(垃圾回收处理器主要管理区域),方法区):(各个线程共享的内存区域),运行时常量池(方法区的一部分),直接内存

垃圾回收机制:
引用计数算法:添加引用计数器,为零时就是不可引用,相互引用时无法回收;
根搜索算法:从GC Roots节点开始向下搜索,搜索走过的路径为引用链,当对象到GCROOT没有引用链时,对象不可用。


引用:在虚拟机栈中的ReFerence 类型的数据中存储的数值代表另一块内存的起始地址(JDK1.2之前的概念);
强引用:类似Object =new Object();为强引用,强引用存在,永远不会被回收;
软引用:描述还有用但是非必须对象,会经历一次垃圾回收,如果内存不够,第二次就会被回收;
弱引用:描述还有用但是非必须对象,在下次回收时一定会被回收的;
虚引用:幽灵或者幻影引用,不会对对象生存时间造成影响,也无法通过此引用获取对象实例。


清除算法:标记全部需要回收的对象,然后统一回收;效率低,会造成很对不连续空间
复制算法:内存分为相同两块,每次使用一块,使用后将存活对象复制到另一块,清除本块内存对象;效率高,但是减小          内存太多,代价太高
标记-整理算法:标记全部回收对象,将不回收对象移动到内存一端,清除内存其他空间;
分代收集算法:根据对象存活周期,将内存分为几块,java堆分为新生代和老年代,根据年代不同,使用不同的收集算               法,新生代使用复制算法,老年代使用标记清理或者标记整理算法;


Serial收集器:单线程收集器,工作时会暂停其他所有线程,知道收集结束。Client模式下默认的新生代的收集器,简单高效的优点。
ParNew收集器:Serial的多线程版本,除多线程外与Serial一样。在很多server模式下运行,是唯一可以与CMS配合工作的收集器。
ParallelScavenger收集器:新生代收集器,使用复制算法的并行多线程收集器,达到可控制在的吞吐量(吞吐量=运行用户代码时间/(运行用户的代码时间+垃圾收集时间),高吞吐量可以有效的利用CPU的时间,尽快完成程序运算任务,适合在后台运算不需要太多交互的任务)。
SerialOld收集器:Serial的老年代版本,单线程,使用标记-整理算法。
Parallel Old收集器:Parallel Scavenger的老年代版本,多线程,标记整理算法。
CMS收集器:以获取最短回收停顿时间为目标。符合互联网站或者B/S服务端系统注重服务响应速度的应用。使用标记清除算法,过程分为4步:1、初始标记;2、并发标记;3、重新标记;4、并发清除。优点:并发手机,低停顿;缺点:对CPU资源敏感,无法处理浮动垃圾,容易出现大量不连续内存碎片。
G1收集器:标记整理算法,能精确控制停顿时间。


内存分配策略:
1、对象优先在Eden分配;2、大对象直接进入老年代;3、长期存活对象进入老年代(依靠年龄计数器)


类加载时机:
从类加载到内存到卸载出内存,共有七个阶段,加载,验证,准备,解析,初始化,使用,卸载;
有且只有四种情况下,类会初始化:1、遇到new,getstatic、putstatic、invokestatic时,如果没有初始化,则先进行初始化;2、使用java.long.reflect包对类进行反射调用时,如果没有初始化,则先进行初始化;3、初始化一个类时,发现父类没有初始化,则先初始化父类;4、启动虚拟机时,用户需要指定一个执行的主类(包含main()方法的那个类),则进行主类初始化;


类加载过程:
加载:1、通过全限定名获取定义类的二进制字节流;2、将字节流所代表的静态存储结构转化为方法区的运行时数据;3、在java堆中生成一个代表类的java.lang.Class对象作为方法区访问的入口
验证:1、文件格式验证;2、元数据验证;3、字节码验证;4、符号引用验证;
准备:正式为类变量分配内存并设置类变量初始值,内存都在方法区进行分配(仅初始化类变量,不包括实例变量,初始值是数据类型的零值);
解析:该阶段是虚拟机将常量池的符号引用转换为至直接引用的过程;
初始化:类加载过程的最后一步,开始真正执行类中定义的java代码;


类加载器:
类加载器虽然只实现类的加载动作,但是每个类都需要依靠加载它的类加载器和这个类本身确定该类在java虚拟机中的唯一性;
加载器分类:1、启动类加载器;2、扩展类加载器;3、应用程序类加载器;4、用户自定义类加载器;
双亲委派模型:要求除了顶层的启动类加载器外,其他加载器都要有父类加载器,这类父子关系一般不以继承关系实现,而是使用组合关系来复用父加载器代码,自定义加载器在最底层,然后是应用程序类加载器,扩展类加载器,启动类加载器;工作过程是一个类加载器收到加载委托,自己不加载,委派给父类加载器,最终委派给启动类加载器,只有当父类加载器无法加载时,子类才会尝试自己加载;加载的类有优先级关系,避免生成多个不同的同名类;


虚拟机执行引擎:
栈帧:是虚拟机进行方法调用和执行方法的数据结构,是虚拟机运行时虚拟机数据区虚拟机栈中的栈元素,包括局部变量表,操作数栈,方法返回地址,动态链接和一些附加信息;
局部变量表:用于存放方法的参数和方法内部定义的局部变量,以变量槽(shot)为最小单位;
操作数栈:每个元素可以是任意的java数据类型,在方法执行过程中,会有各种字节码指令向操作数栈中写入或提取内容,进行入栈出栈操作;
动态链接:
方法返回地址:方法结束的两种方式:1、正常完成出口,2、异常完成出口。方法退出后,要返回到方法被调用的位置,程序继续向下执行。退出时可能执行的操作有,恢复上层方法的局部变量表和操作数栈,把返回值压入调用者栈帧的操作数栈,调整PC计数器的值指向方法调用指令后面一条指令;
方法调用:该阶段的唯一任务是确定被调用任务的版本(即调用的是哪个方法),暂时不涉及方法内部的具体执行过程
解析:解析成立的前提:方法在程序执行之前就有一个可确定的调用版本,并且方法的调用版本在运行期是不可逆的。“编译期可知,运行期不可变”的方法主要有静态方法和私有方法,前者是和类型有关,后者是外部不可访问,都不能通过继承或者其他方式重写其他版本;
分派:
1.    静态分派:所有依赖静态类型来确定方法执行版本的分派动作,都叫静态分派,典型应用是方法重载。静态分派发生在编译阶段,因此不是虚拟机来执行的;
2.    动态分派:与重写有密切关联。在运行期间根据实际类型确定方法执行版本的方式称为动态分派;
3.    单分派和多分派:方法的接收者和方法的参数称为方法的宗量。单分派根据一个宗量对方法进行分派,多分派根据多于一个宗量对方法进行分派;


高效并发:
主内存与工作内存的交互的8种操作:
lock(锁定):作用于主内存变量,把一个变量标识为一条线程独占的状态;
unlock(解锁):作用于主内存变量,把锁定的变量释放出来,释放后才可以被其他线程锁定;
read(读取):用于主内存变量,那主内存变量的值传输到工作内存,以便接下来的load(载入)操作使用;
load(载入):用于工作内存变量,把read操作的到的变量值存到工作内存的变量副本中;
use(使用):用于工作内存,把工作内存变量的值传给执行引擎,每当虚拟机遇到需要使用该值的字节码指令时都会执行该操作;
assign(赋值):用于工作内存,把执行引擎获取的值赋值工作内存的变量,每当遇到该执行指令时执行该操作;
store(存储):用于工作内存,把工作内存的变量的值传给主内存,以便接下来的write(写入)操作;
write(写入):作用于主内存变量,把store操作获取的值放入主内存的变量中;
执行8种操作的规则:
1.    不允许read,load,store,write单独出现,即不可以出现主内存读取了变量值,但是工作内存不接受或者工作内存发起回写操作但是主内存不接受的情况;
2.    不允许一个线程丢弃它最近的assign操作,即变量值改变后一定要回写给主内存;
3.    不允许一个线程无原因(没有assign操作)把数据从工作内存回写给主内存;
4.    一个新的变量只能在主内存产生,工作内存不能使用一个没有经过初始化或者赋值的变量,即use和store操作之前一定要有assign和load操作;
5.    一个变量在同一时刻只可以被一个线程lock,但是可以被同一线程lock多次,多次lock后,只有执行相同次数的unlock才可以再次被其他线程lock;
6.    一个变量被lock后,会清空工作内存里的值,在执行引擎使用变量前,需要重新执行load或者assign操作;
7.    一个变量没有被lock,则不允许执行unlock,也不允许去unlock一个被其他线程lock的变量;
8.    对一个变量执行unlock前,要把变量同步会主内存,即执行store和write操作;
先行发生原则:
程序次序规则:按照程序代码顺序,前面的操作先于后面的操作发生;
管程锁定规则:unlock操作先于对同一个锁的lock操作;
volatile变量规则:对一个volatile变量的写操作先于对这个变量的读操作;
线程启动规则:Thread对象的start()方法先于此线程的没一个操作;
线程终止规则:线程所有操作都有先于线程终止操作,可以通过Thread.join()方法和Thread.isAlive()方法的返回值等方式检测到线程已终止执行;
线程中断规则:线程的interrupt()方法的调用要先于对线程的中断之前发生,可以通过该方法测试是否有中断发生;
对象终结规则:一个对象的初始化完成要在它的finalize()方法;
传递性:A先于B,B先于C,可以判断A先于C发生;


线程:
实现线程的3种方式:
1.    使用内核线程实现:使用操作系统内核,轻量级进程,过于消耗内核资源,支持数量有限;
2.    使用用户线程实现:完全建立在用户空间上,如果程序实现得当,线程不需要切换到内核态,支持更多数量,1:N;
3.    混合实现:既有用户线程又有内核线程;
进程状态转换:
新建:创建后未启动的线程;
运行:Runable包括了操作系统线程状态中的Runing和Ready,此线程有可能正在执行或者正在等待CPU分配执行时间;
无限期等待:此状态的线程不会被CPU分配执行时间,要等待其他线程显式唤醒,没有设置Timeout参数的Object.wait()方法和Thread.join()方法,LockSupport.park()方法;
限期等待:不会被CPU分配时间,但是在一定时间后会被系统自动唤醒;
阻塞:阻塞在等待获取一个排它锁,这个事件将在另一个线程放弃这个所得时候发生;
结束:终止线程的线程状态,线程已经结束执行;

java线程安全:
5类共享的数据操作:
1.    不可变:不可变的对象一定是线程安全的,不可变的安全是最简单最纯粹的,只要一个不可变对象被正确的创建,其外部的可见状态用于不会改变,永远也看不到它在多个线程中处于不一致状态;
2.    绝对线程安全:java.util.Vector绝对线程安全类,但不是真正绝对;
3.    相对线程安全:通常意义的线程安全,需要保证对这个对象单独操作是线程安全的;
4.    线程兼容:本身不是线程安全,但是可以在调用端通过同步手段来保证对象在并发环境下安全使用;
5.    线程对立:在调用端不论使用何种方法,都不能再多线程环境中安全使用;
线程安全的实现:
1.    互斥同步:同步是指多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一条线程使用,互斥是实现同步的一种手段、临界区,互斥量,信号量;最基本的互斥同步手段是synchronized关键字;
2.    非阻塞同步:
3.无同步方案:可重入代码、线程本地存储;

锁优化:
1.自旋锁:为避免短时间内挂起和回复线程,可以让请求锁的线程执行忙循环(自旋),等共享数据锁被释放后获取锁;
2.锁消除:指在即时编译器运行时,对一些代码要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除;
3.所粗化:如果虚拟机探测到有这样一串零碎操作对同一个对象加锁,将会把加锁同步的范围扩展到整个操作序列的外部;
4.轻量级锁:
5.偏向锁:这个锁会偏向第一个获取他得线程,当接下来没有其他线程获取该锁的时候,持有该锁的线程永远不需要同步;


jeesite页面上通过以自定义jstl <sys:treeselect >方式引入树形选择
1、<sys:treeselect id="company" name="company.id" value="${user.company.id}" labelName="company.name" labelValue="${user.company.name}" 
title="公司" url="/sys/office/treeData?type=1" cssClass="input-small" allowClear="true"/>
     
首先通过sys:treeselect(taglib.jsp) 找到web-inf/tags/sys/treeselect.tag文件


2、treeselect.tag 
     第一个作用是局部页面样式。
<div class="input-append">
<input id="${id}Id" name="${name}" class="${cssClass}" type="hidden" value="${value}"/>
<input id="${id}Name" name="${labelName}" ${allowInput?'':'readonly="readonly"'} type="text" value="${labelValue}" data-msg-required="${dataMsgRequired}"
class="${cssClass}" style="${cssStyle}"/><a id="${id}Button" href="javascript:" class="btn ${disabled} ${hideBtn ? 'hide' : ''}" style="${smallBtn?'padding:4px 2px;':''}">&nbsp;<i class="icon-search"></i>&nbsp;</a>&nbsp;&nbsp;
</div>
 
   第二个作用:接收传参。通过sys:treeselect 后面的key=value...具体可以看下treeselect.tag的解释
   第三个作用:触发点击事件。引用了jbox.js
   top.$.jBox.open("iframe:${ctx}/tag/treeselect?url="+encodeURIComponent("${url}")+"&module=${module}&checked=${checked}&extId=${extId}&isAll=${isAll}", "选择${title}", 300, 420, {
ajaxData:{selectIds: $("#${id}Id").val()},buttons:{"确定":"ok", ${allowClear?"\"清除\":\"clear\", ":""}"关闭":true}, submit:function(v, h, f){
   top:调用父类窗口(如果去除,效果还在,不过会被弹出窗口挡住)
   $.jBox.open :指打开一个窗口以iframe的形式,冒号后面跟着url,ajaxData是额外的参数
   submit:function(v, h, f):/* 点击状态按钮后的回调函数,返回true时表示关闭窗口,参数有三个,v表示所点的按钮的返回值,h表示窗口内容的jQuery对象,f表示窗口内容里的form表单键值 */


3、通过${ctx}/tag/treeselect 跳转到modules/sys/tagTreeselect.jsp 页面


4、tagTreeselect是jbox生成的iframe里的内容。
   script里全是ztree的配置,ajax,回调函数,和对节点的操作。

iframe:创建一个内联框架(一个新的页面);

sqlplus:
创建用户,创建用户的命令格式如下:
  create  user  用户名  identified   by   密码  default   tablespace   用户默认使用哪一个表空间;
  修改用户的权限:
  grant   角色1,角色2  to  用户名;
  举例如下:
  create   user   yanglei   identified    by    yang123    default   tablespace   yang;
  grant   dba, connect    to   yanglei;
授权成功。

面试:
2019-03-06:静态变量和实例变量的区别?
    答:1:首先在语法定义上区别:静态变量前面要加static,实例变量不用
2:在程序运行时:
  实例变量输入对象的属性,必须创建了实例对象(如 new)才会被分配空间,才可以使用实例变量,静态变量不属于某个实例对象,而是属于类,也叫类变量,只要程序加载了类的字节码,不用创建任何实例对象就会被分配空间,就可以被使用
3:总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
注意:(static)静态变量的使用也是有局限性的,一个静态方法中不能调用类中的非静态的方法和变量,static修饰的变量在类加载后在内存中只有一份内存空间,可以被一个类的所有实例对象所共享。
    使用Java打印以下图形,行数为n:
        *
       ***      
2019-03-14:
Java内存溢出:
导致OutOfMemoryError异常的常见原因有以下几种:

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
使用的第三方软件中的BUG;
启动参数内存值设定的过小;
此错误常见的错误提示:

tomcat:java.lang.OutOfMemoryError: PermGen space
tomcat:java.lang.OutOfMemoryError: Java heap space
weblogic:Root cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError
一、增加jvm的内存大小。方法有: 1)在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。 2)对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:

set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M
或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M -Xmx256M

3)对resin容器,同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件,内容如下:

@echo off
call "httpd.exe"  "-Xms128M" "-Xmx256M"
:end
其中"-Xms128M"为最小内存,"-Xmx256M"为最大内存。

二、 优化程序,释放垃圾。

主要包括避免死循环,应该及时释放种资源:内存, 数据库的各种连接,防止一次载入太多的数据。导致java.lang.OutOfMemoryError的根本原因是程序不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。 遇到该错误的时候要仔细检查程序,嘿嘿,遇多一次这种问题之后,以后写程序就会小心多了。

Java代码导致OutOfMemoryError错误的解决:
需要重点排查以下几点:

检查代码中是否有死循环或递归调用。
检查是否有大循环重复产生新对象实体。
检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
tomcat中java.lang.OutOfMemoryError: PermGen space异常处理
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh在

echo "Using CATALINA_BASE:   $CATALINA_BASE"
上面加入以下行:

JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

事物管理:(在一个方法里对多次数据库操作进行统一管理)
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。 
事务有四个特性:ACID

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

JVM 内存回收:


JVM加载class文件的原理:

XSS攻击,SQL注入攻击,CSRF攻击:

MySQL的复合索引和使用方法:
Oracle 10g的AWR:
MySQL执行查询的步骤:
1.连接
  1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求
  1.2将请求转发到‘连接进/线程模块’
  1.3调用‘用户模块’来进行授权检查
  1.4通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求
2.处理
  2.1先查询缓存,检查Query语句是否完全匹配,接着再检查是否具有权限,都成功则直接取数据返回
  2.2上一步有失败则转交给‘命令解析器’,经过词法分析,语法分析后生成解析树
  2.3接下来是预处理阶段,处理解析器无法解决的语义,检查权限等,生成新的解析树
  2.4再转交给对应的模块处理
  2.5如果是SELECT查询还会经由‘查询优化器’做大量的优化,生成执行计划
  2.6模块收到请求后,通过‘访问控制模块’检查所连接的用户是否有访问目标表和目标字段的权限
  2.7有则调用‘表管理模块’,先是查看table cache中是否存在,有则直接对应的表和获取锁,否则重新打开表文件
  2.8根据表的meta数据,获取表的存储引擎类型等信息,通过接口调用对应的存储引擎处理
  2.9上述过程中产生数据变化的时候,若打开日志功能,则会记录到相应二进制日志文件中
3.结果
  3.1Query请求完成后,将结果集返回给‘连接进/线程模块’
  3.2返回的也可以是相应的状态标识,如成功或失败等
  3.3‘连接进/线程模块’进行后续的清理工作,并继续等待请求或断开与客户端的连接
单例类:
public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}
事物的ACID是什么:
⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
     因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响
⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态   变换到   另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  关于事务的隔离性数据库提供了多种隔离级别。
⑷ 持久性(Durability)
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
SpringAOP的应用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
MySQL和Oracle的区别:
1. 自动增长的数据类型处理
2. 单引号的处理
3.  翻页的SQL语句的处理
4. 长字符串的处理
5.  日期字段的处理
6.  空字符的处理
7. 字符串的模糊比较
8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。

WPS文字转Word文档格式乱七八糟可能是由于以下几个原因导致的: 1. 版本兼容性问题:WPS和Word是两款不同的办公软件,它们使用的文件格式不完全相同。当你使用WPS文字转换为Word文档时,某些格式可能无法完全转换或被转换成不同的格式,导致文档格式混乱。 2. 复杂格式处理问题:如果原始文档中包含复杂的格式,如表格、图表、插图等,WPS文字转换为Word可能无法完全保留原始格式,并且可能会出现错位、缺失或乱码等问题。 3. 字体兼容性问题:WPS和Word使用的字体库有所不同,如果原始文档中使用了某些特殊字体,在转换过程中可能会导致字体替换或无法显示的问题,进而影响整体文档的格式。 为避免格式混乱,你可以尝试以下方法: 1. 使用相同软件:如果可能的话,建议在同一款软件中完成文档的编辑和转换,例如,在WPS中编辑的文档最好在WPS中进行转换。 2. 简化格式:在进行转换前,尽量避免使用过多的复杂格式和特殊字体,尽量使用常见的字体和格式,以增加转换的成功率。 3. 逐步转换:如果你的文档比较复杂,可以将文档分成多个部分进行转换,以便更好地处理格式问题。 4. 检查转换结果:在转换后,务必仔细检查文档的格式,并进行必要的调整和修复,以确保文档的可读性和准确性。 需要注意的是,由于WPS和Word是两个不同的软件,无法保证在转换过程中完全保留原始文档的格式,因此可能会存在格式混乱的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值