- 博客(19)
- 收藏
- 关注
原创 spring开发笔记(4)spring mvc多环境下配置文件的设置
在实际开发时经常需要把一些配置信息写在配置文件,比如mysql的主机地址、端口号、用户名和密码等。另外,在开发代码时可能用一套配置参数,而部署到测试环境时又会用另一套配置参数,测试完毕再部署到线上环境时,又需要使用线上环境下的另一套参数。因此,实际开发中面临着如何给工程添加多个环境下的配置文件、且要保证不同环境下能自动使用不同的配置文件的问题。spring提供了spring.profiles.ac...
2018-04-24 22:21:57 14129 3
原创 spring开发笔记(3)spring mvc原理及入门
我们开发的web应用程序是要放到tomcat之类的web容器里运行的,当http请求到来时,tomcat会把请求交给web应用的某个servlet处理。在开发web应用时,自然而然的,我们会想到有多少种http请求需要处理,就编写多少个servlet,然后在web.xml里配置好servlet和http请求uri的对应关系。比如,要处理/add、/query、/delete、/update这4个请...
2018-04-24 16:29:37 441
原创 spring开发笔记(2)spring原理及入门
spring容器原理spring家族体系庞大,功能强大,但就其最根本的本质来说,spring就是一个IoC容器,通常也称为spring容器。什么是IoC容器呢?所谓容器,顾名思义,就是可以装很多东西的一个器物。spring容器里装的是什么呢?是一个个对象,也就是说,spring容器是一个可以装很多对象的容器。在spring以前,我们在开发程序时,所有的对象都是要自己一个个new出来的,或者通过工厂...
2018-04-22 01:25:27 441
原创 spring开发笔记(1)tomcat容器运行原理
我们开发的web应用都是跑在web容器中的。Tomcat就是一个常用的Web容器。对于java web开发,安装好jdk及java集成开发工具后,第一要紧的事是安装tomcat。在linux下,从tomcat官网下载tomcat压缩文件后,直接解压就可以了。进入tomcat目录,能看到如下目录:其中bin目录是里存放了tomcat的启动脚本,conf目录保存的是tomcat的配置文件。在命令行中进...
2018-04-19 14:35:37 3060
原创 《深入理解Java虚拟机》学习笔记(8)--线程安全与锁优化
Java中的线程安全按照线程安全的“安全程度”由强至弱来排序,java里面各种操作共享的数据分为以下5类:不可变,绝对线程安全,相对线程安全,线程兼容,线程对立 不可变不可变的对象一定是线程安全的。被final修饰的基本数据类型是不可变的。对象也可以是不可变的,前提是对象的行为不会对其状态产生任何影响(只要将对象的所有字段都用final修饰即可)String、Integer
2017-11-09 17:27:29 595
原创 《深入理解Java虚拟机》学习笔记(7)--Java内存模型与线程
为了解决CPU与内存之间速度不匹配的问题,会CPU和内存之间加入一个高速缓存(Cache)。对于多核(即多个CPU)系统,每个CPU都会有自己的高速缓存。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也引入了新的问题:缓存一致性,即多个CPU共享同一个主内存,会把主内存的数据缓存到各自的高速缓存中,当各CPU的高速缓存中的数据不一致时,以哪个高速缓存中的数据为准呢?为了
2017-11-09 17:25:55 243
原创 《深入理解Java虚拟机》学习笔记(6)--程序编译与代码优化
早期(编译期)优化Javac这类编译器对代码的运行效率几乎没有任何优化措施。对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由Javac产生的Class文件也同样能享受到编译器优化所带来的好处。Javac做了许多针对Java语言编码过程的优化措施来改善程序员的编码风格和提高编码效率。相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来
2017-11-01 17:02:43 580
原创 《深入理解java虚拟机》学习笔记(5)--虚拟机字节码执行引擎
运行时栈帧结构 栈帧是支持虚拟机进行方法调用和执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。 在编译时,一个栈帧需要分配多少内存就完全确定了。只有当前栈帧是有效的。 每个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。1.局部变量表 局部变量表是一组变量值存
2017-10-26 16:35:28 392
原创 《深入理解java虚拟机》学习笔记(4)--虚拟机类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但却为java程序提供了高度的灵活性。 类的生命周期类从加载到虚拟机内存开始,到卸载出内存为止,生命期分为:
2017-10-26 16:11:01 363
原创 《深入理解Java虚拟机》学习笔记(3)--内存分配与回收策略
对象的内存分配,往大方向讲,就是在堆上分配。对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况也可能会直接分配在老年代中,具体的分配规则取决于虚拟机自己的设置。1.对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC.Minor GC:新生代GC,非常频
2017-09-27 20:20:19 298
原创 《深入理解Java虚拟机》学习笔记(2)--垃圾收集器
一、Jvm垃圾回收区域程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作。每一个栈帧中分配多少内存基本是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性,在这三个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。而java堆和方法区不一样,一个接口中的多个实现类需要
2017-09-27 20:17:48 246
原创 《深入理解java虚拟机》学习笔记(1)--jvm内存区域
1. jvm运行时数据区java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:(1) 程序计数器指向下一条将要执行的字节码指令。线程隔离的区域,每个线程都有自己的程序计数器。(2) java虚拟机栈虚拟机栈也是线程私有的,每个线程有自己的虚拟机栈。每
2017-09-22 18:12:02 284
原创 epoll触发事件的分析
我们知道,可以将套接字放入到epoll中监听,当套接字上有事件发生时,epoll就会通知我们。epoll机制可以监听套接字上的以下6种事件:EPOLLIN:套接字可读EPOLLOUT:套接字可写EPOLLRDHUP:对端关闭了套接字,或者对端关闭了写EPOLLPRI:套接字上有紧急数据到达EPOLLHUP:对端挂断了套接字那么,什么情况下会在套接字上触发以上
2017-09-22 13:00:10 5223 1
原创 java io
Java对io的支持很完善,定义了许多类(流)对io操作提供支持。Java io类结构如下图所示:可以看出,java io类非常庞大。但这些类也是有规律的,从不同的角度,可以划分为不同的类别。按数据流向不同分类:输入流和输出流(1)输入流:从文件读入到内存。只能进行读操作。InputStream类、Reader类都是输入流。(2)输出流:从内存输出到文件。只能进
2017-09-20 20:11:21 211
原创 java动态代理
1.静态代理 如果我们有如下接口及具体实现:public interface StudentService { void setScore(long id, int score); void awardStudent(long id);}public class StudentServiceImpl implements StudentService {
2017-08-31 16:59:15 345
原创 Java的反射
1.什么是反射当我们在需要一个类的实例时,一般都是new一个对象出来,然后再在该对象上调用方法。假设目前我们有个Bird类:public class Bird { private static String master = "amy"; private String name; public static void sayHello() { Sy
2017-08-29 19:37:27 277
原创 Java中的Date和时区转换
1.Date中保存的是什么在java中,只要我们执行Date date = new Date();就可以得到当前时间。如:Date date = new Date();System.out.println(date);输出结果是:Thu Aug 24 10:15:29 CST 2017也就是我执行上述代码的时刻:2017年8月24日10点15分29秒。是不是Date对象里存了年月日时分秒呢?不是...
2017-08-25 14:42:26 93975 23
原创 Linux进程被信号杀死后退出状态码(exit code)的分析
linux系统下,进程对信号的默认响应方式有5种:1) 忽略信号,即当做没收到信号一样;2) 终止进程;3) 产生核心转储文件,同时进程终止;4) 停止进程,即暂停进程的执行;5) 于之前的暂停之后恢复执行;处理方式2和3都会导致进程终止执行立即退出,处理方式1、4、5不会造成进程终止执行。因此,可以将信号粗略的分为两类,一类是会导致进程终止并退出的信号;另一类则
2017-05-27 18:57:46 62427 3
原创 访问后端服务负载均衡的方法
在开发过程中,经常需要请求后端某个服务,而这个服务通常会部署在一个集群上,维护这个服务的同事一般都会给我们一个服务器地址列表,让我们请求这个列表中的服务器。最简单也是最偷懒的方法,就是任选一个服务器,在代码中只使用这个服务器,每次都请求这个服务器。这么做的问题有两个,一是万一这个服务器出故障了,在故障恢复前所有请求都会失败;二是所有的请求都发送到这个服务器上,当请求量小时还好,请求量大时会这把这个服
2017-02-10 18:24:40 2194
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人