- 博客(45)
- 资源 (4)
- 问答 (3)
- 收藏
- 关注
原创 Tomcat内存增长分析
问题:Tomcat从启动一个项目到加载完毕,这个阶段占用了500+MB 之后随便访问项目几个页面,tomcat内存蹭蹭涨到了800+MB。从启动的500+MB到800+MB期间只花了2分钟左右。(pid不同是因为截图问题) 当时怀疑内存泄露了,于是导出刚启动tomcat的dump文件和已经涨到800多的dump文件进行对比。 发现没有什么占内存的对象。于是配置tomcat的监控工具来监控JVM
2017-02-21 16:35:56 6835 4
原创 Java多线程(ReentrantReadWriteLock类)
类ReentrantLock具有完全互斥的效果,即同一时间只有一个线程在执行ReentrantLock()方法后面的任务。这样做虽然保证了实例变量的线程安全性,但效率低下。通过ReentrantReadWriteLock类可以在某些不需要操作实例变量的方法中,完全可以使用读写锁(ReentrantReadWriteLock)来提升效率。读写锁表示有两个锁,一个是读操作的锁,也称共享锁;一个是写操作的
2016-11-29 15:11:52 1030
原创 Java多线程(一些常用方法)
int getHoldCount1:int getHoldCount()的作用是查询当前线程保持此锁定的个数,也就是调用lock()方法的次数。 int getQueueLength2:int getQueueLength()的作用是返回正等待获取此锁定的线程估计数,比如有5个线程,1个线程首先执行await()方法,那么在调用getQueueLength()方法后返回的值是4,说明有4个线程同时
2016-11-29 10:42:19 1253
原创 Java多线程公平锁与非公平锁
公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待首先Java中的ReentrantLock 默认的lock()方法采用的是非公平锁。 这个时候你会发现打印是有序的,排队在前面的线程直接获取锁。这就是公平锁 当把true改成false之后,线程3先进来,却发现被线程4获得
2016-11-25 15:10:51 7909
原创 Java多线程Condition实现等待/通知
Java多线程可以通过synchronzied与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式。 通过显式Lock和Condition也可以实现等待/通知模式。因为在使用notify()/notifyAll()方法进行通知时,被通知的线程是由JVM随机选择的。但是通过Lock和Condition可以选择性的通知,更灵活。在condition.await()方
2016-11-25 12:00:52 1112
原创 Java多线程值继承(InheritableThreadLocal )
InheritableThreadLocal可以在子线程中获取父线程继承下来的值。InheritableThreadLocal 实现原理 这个时候线程A获取到了Main父线程的值 我把顺序替换一下就获取不到了!暂时还没搞清楚原因值继承再修改重写InheritableThreadLocal的一些方法 在使用InheritableThreadLocal类需要注意,如果子线程在取得值的同时,主线
2016-11-24 15:16:37 2309 1
原创 Java多线程数据隔离(ThreadLocal)
变量值的共享可以使用public static变量的形式,所有的线程都使用同一个public static变量。如果想实现每一个线程都有自己的共享变量需要用到类ThreadLocal。 这里的线程A和B共用一个静态变量t1,但是两个线程的变量数据互不干扰。说明每个线程都有属于自己的私有数据。无论是子线程还是父线程,数据都是隔离的。
2016-11-24 14:33:39 2529
原创 Java多线程生产者/消费者模式(二)
4:一生产与一消费案例(操作栈) 通过使用生产者/消费者模式,容器size()的值不会大于1。5:一生产与多消费案例(操作栈) 这里出现异常的原因是因为MyStack类中使用了if语句作为条件判断,因为条件发生改变时并没有得到及时的响应,所以多个wait状态的线程被唤醒,继而执行list.remove(0)代码出现异常。将if改成while语句可以解决。 当把if改成while之后会出现假死状
2016-11-24 10:33:31 796
原创 Java多线程生产者/消费者模式(一)
等待/通知模式最经典的案例就是“生产者/消费者”模式。1:一生产与一消费案例 创建一个存储值的对象ValueObject 创建一个生产者 创建一个消费者 在控制台中打印的日志get和set是交替运行的。2:多生产/多消费的假死“假死”的现象其实就是线程进入waiting等待状态。如果全部线程都进入waiting状态,则程序就不再执行任何业务功能了,整个项目呈停止状态。这个时候开启一个线程
2016-11-23 16:27:50 798
原创 Java多线程机制
1:新创建一个线程对象后,再调用它的start()方法,系统会为此线程分配CPU资源,使其处于Runnable(可运行)状态,这是一个准备运行的阶段。如果线程抢占到CPU资源,此线程就处于Running(运行)状态。2:Runnable状态和Running状态可相互切换,因为有可能线程运行一段时间后,有其它高优先级的线程抢占了CPU资源,这时此线程就从Running状态变成了Runnable状态。线
2016-11-23 11:49:22 716
原创 Java多线程wait()和notify()
方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程置入“预执行队列”中,并且在wait()所在的代码行处停止执行,直到接到通知或被中断位置。在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。在执行wait()方法后,当前线程释放锁。在从wait()返回前,线程与其它线程竞争重新获得锁
2016-11-23 11:04:27 540
原创 Java多线程锁对象的改变
在将任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的锁对象,则这些线程之间就是同步的;如果分别获得锁对象,这些线程之间就是异步的。 这个时候线程A和B持有的锁都是”123”,虽然将锁改成了”456”,但结果还是同步的,因为A和B共同争抢的锁是”123”。把Thread.sleep(50)放开 这个时候A取得的锁是”123”,过了50毫秒之后B线程取得的锁上
2016-11-22 15:33:01 2235 2
原创 Java多线程的死锁
Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待不可能被释放的锁,从而导致所有的任务都无法继续完成。 死锁是程序设计的BUG,在设计程序时就要避免双方互相持有对方的锁
2016-11-22 14:16:09 861 2
原创 Java多线程String的常量池特性
在JVM中具有String常量池缓存的功能将synchronized(string)同步块与String联合使用时,要注意常量池带来的一些例外。 出现这样的情况是因为String的两个值都是AA,两个线程持有相同的锁,所以造成线程B不能执行。这就是String常量池所带来的问题。 这样实例化一个对象就持有两个不同的锁了。
2016-11-22 11:01:55 1582 1
原创 Java多线程的暂停与恢复
暂停线程意味着此线程还可以恢复运行。在Java多线程中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。 在使用suspend与resume方法时,如果使用不当,很容易造成公共的同步对象独占,使得其它的线程无法访问公共同步对象。这两个方法已经过时了,容易造成死锁。 因为println()方法也是同步的,如果当程序运行到println()方法内部停止的时候,同步
2016-11-21 15:30:51 2430 6
原创 Java多线程停止线程
停止线程是在多线程开发时很重要的技术点,大多数停止一个线程的操作使用Thread.interrupt()方法,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。Thread.stop()方法也可以停止线程,但最好不用它。这个方法不安全并且已经被弃用了。 上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。这个时候可以使用抛出异常法来解决。 用
2016-11-21 14:36:32 1077 3
原创 Java多线程共享资源
多线程中的一个核心问题就是对共享资源的读写问题。你永远都不知道一个线程何时在运行。如果同时有多个线程对一个对象进行读写,结果就会出现脏数据接下来展示一个多线程同时对一个对象进行读写出现脏数据的案例。为了方便解耦,创建一个抽象类。public abstract class Ingenerator { private volatile boolean caceled = false; p
2016-11-10 21:46:00 3315
原创 Java多线程捕获异常
由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法,它就会向外传播到控制台。 将main的主体放到try-catch也是没有用的。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Threa
2016-11-10 00:31:22 699
原创 Java多线程join()
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 也可以在调用join()时带上一个超时的参数,这样如果目标线程A在这段时间到期时还没有结束的话,join()方法返回,执行线程B,这个时候AB两个线程一起执行。 并且对join()方法的调用可以被中断,做法是在调用
2016-11-08 23:27:42 820
原创 Java多线程内部类
有时通过内部类来将线程代码隐藏在类中将会很有用public class InnerThread1 { private int countDown = 5; private Inner inner; private class Inner extends Thread{ public Inner(String name) { super(na
2016-11-08 22:34:32 647
原创 Java多线程编码的变体
到目前为止,博客中大部分示例任务类都实现了Runnable。在非常简单的情况下,你可能会希望使用直接从Thread继承这种可替换的方式。public class SimpleThread extends Thread { private int countDown = 5; private static int threadCount = 0; public SimpleThre
2016-11-08 00:10:03 1130
原创 Java多线程后台线程
后台线程是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的一部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。反过来说,只要有任何非后台线程还在运行,程序就不会终止。比如,执行main()的就是一个非后台线程。import java.util.concurrent.TimeUnit;public class SimpleDaem
2016-11-03 23:48:13 1066
原创 Java多线程优先级
线程的优先级将该线程的重要性传递给调度器。尽管CPU处理现有线程集的顺序是不确定的,但是调度器将倾向于让优先权最高的线程先执行。你可以用getPriority()来读取现有线程的优先级,并且在任何时刻都可以通过setPriority()来修改优先级。import java.util.concurrent.ExecutorService;import java.util.concurrent.Exe
2016-11-03 22:07:06 981
原创 Java多线程Callable接口
Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。import java.util.ArrayList;
2016-11-02 23:02:08 688
原创 Java多线程由易到难
线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令。public class LiftOff implements Runnable { protected int countDown = 10; private static int taskCount = 0;
2016-11-01 23:59:20 969
原创 Nginx安装ssl模块和nginx_lua模块
声明,为了简单介绍,所有命令默认root权限在Centos环境下,生成证书前先要确保安装openSSL和openSSL-devel模块yum install opensslyum install openssl-devel下载编译LuaJIT2.0(是一个利用JIT编译技术把Lua脚本直接编译成机器码由CPU运行)wget -c http://luajit.org/download/LuaJIT
2016-09-01 11:50:07 2171 2
原创 CentOS6.5安装Redis3.0稳定版
1:下载wget http://download.redis.io/releases/redis-3.0.0.tar.gz2:解压tar zxvf redis-3.0.0.tar.gz3:进入解压后的Redis文件夹并执行make编译(需要gcc支持)4:这个时候便安装成功了,下一步启动Redis3.0src/redis-server src在解压之后的Redis文件夹里
2016-08-05 20:54:34 1172
原创 Nginx+Tomcat配置动静分离(附完整配置+注释)
我的环境Centos6.5 X86_64Nginx1.8.0Tomcat7.oNginx配置#Nginx.confuser caogen;worker_processes 1; #因为我用的是虚拟机 只设置了1CPUerror_log logs/nginx_error.log error;error_log logs/nginx_info.log info;pid
2016-07-26 09:49:35 4547
原创 Centos7设置静态IP
BOOTPROTO=static #dhcp改为static(修改) ONBOOT=yes #开机启用本配置,一般在最后一行(修改) IPADDR=192.168.1.132 #静态IP(增加) NETMASK=255.255.255.0 #子网掩码(增加) NM_CONTROLLED=no表示该接口将通过该配置文件进行设置,而不是通过网络管理器进行管理(增加)保存退出。 重启网卡这里可
2016-07-18 15:30:28 563
原创 JVM内存溢出监控自动化
1:手动生成Java heap dump首先需要搞懂什么是java heap,java heap是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。启动一个JAVA项目,环境变量配置了JDK环境jps命令是jdk用来查看java进程的命令,252是当前正在运行的j
2016-07-08 16:06:18 2711
原创 非常经典的JAVA编程题(条件运算符)
代码下载:https://github.com/IsResultXaL/Algorithm/blob/master/src/ConditionOperator.java有更好的方案请在评论里分享!题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示import java.util.Scanner;/** * 题目:利用条件运算符
2016-05-04 10:35:07 2776
原创 非常经典的JAVA编程题(正整数分解质因数)
代码下载:https://github.com/IsResultXaL/Algorithm/blob/master/src/FenJie.java有更好的方案请在评论里分享!程序分析和题目借鉴的这篇博客(http://blog.sina.com.cn/s/blog_60fafdda0100wb21.html), 非常感谢这篇博客的作者题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3
2016-04-29 16:03:59 8543 5
原创 非常经典的JAVA编程题(水仙花数)
代码下载:https://github.com/IsResultXaL/Algorithm/blob/master/src/FindDaffodilNumber.java有更好的方案请在评论里分享!题目:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 程序分析:利用for循环
2016-04-29 09:50:57 11994 6
原创 非常经典的JAVA编程题(素数)
代码下载:https://github.com/IsResultXaL/Algorithm/blob/master/src/FindPrimeNumber.java有更好的方案请在评论里分享!题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。impor
2016-04-28 17:35:45 4061 4
原创 非常经典的JAVA编程题(兔子规律)
代码下载:https://github.com/IsResultXaL/Algorithm/blob/master/src/rabbit.java题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21…./** * 兔子问题 * 斐
2016-04-28 17:28:41 11355
转载 Cookie与Session的区别-总结很好的文章
转自 http://www.lai18.com/content/407204.html本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对自己的开发工作中灵活运用带来启示。cookie机制Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP
2016-03-17 09:52:51 991
转载 在Java中如何高效的判断数组中是否包含某个元素
来自 http://www.hollischuang.com/archives/1269?如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的。本文将分析几种常见用法及其时间成本。检查数组是否包含某个值的方法
2016-03-12 13:19:57 4102
原创 nginx+tomcat+memcached session共享
我的环境:ip:192.168.1.150(这是一台linux服务器 80端口是nginx端口 8085端口是tomcat项目端口)ip:192.168.1.130(这是一台windows服务器 8085端口是tomcat端口)我的memacahed装在Windows下的,两个tomcat共用一个memacached节点运行结果通过访问192.168.1.150:80端口可以通过权重分发
2016-02-19 13:45:41 1673
原创 Nginx1.8.1+Tomcat7.0负载均衡
安装nginx的方法在nginx文章分类的第一篇博客里面!我的环境:ip:192.168.1.150(这是一台linux服务器 80端口是nginx端口 8085端口是tomcat项目端口)ip:192.168.1.130(这是一台windows服务器 8085端口是tomcat端口)负载均衡与反向代理结果:通过访问192.168.1.150:80端口可以通过权重分发服务器比如:第一次
2016-02-18 10:19:05 2392
原创 Ubuntu14.04安装tomcat7.0和jdk1.7
1:首先下载tomcat和jdk的安装包,官网下载(我的是64位操作系统,如果用命令下载jdk的时候下载不了,请到浏览器输入下载地址下载)sudo mkdir /usr/java 新建一个java文件夹cd /usr/java 跳转到java文件夹wget http://apache.fayea.com/tomcat/tomcat-7/v7.0.67/bin/apac
2016-02-17 11:48:39 2087
TA创建的收藏夹 TA关注的收藏夹
TA关注的人