给大家推荐一个最简单的判定你的java应用是否正常的方法: step1:部署你的应用,让它跑起来: step2:打开jdk下bin目录下的jconsole.exe工具,连接到你的应用——以监测线程和内存的变化: step3:让你的应用运行一段时间(一天或者数天): step4:查看jconsole上你的应用对应的堆内存空间变化情况,以及线程变化情况: 如果得到的两条线具有显著地周期性,那么你的应用基本上就是正常的. 想想看,如果你的java应用运行了很长时间,堆内存变化曲线或线程变化曲线,都不具…
系列文章 Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore Java Spring Boot VS .NetCore (五)MyBatis vs E…
前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建线程都要重复创建. 假设有个提供http服务的程序,每天要处理几万,上百万等等的用户请求,那么我们的程序岂不是每次请求都会创建一次Runnble的实现对象?这种大量重复创建同一个对象显然会造成大量的内存资源浪费(如果再增加GC的要回收他们所需要消耗的系统资源,显然耗费的资源只会比表面看起来更多) /…
上篇随笔介绍了线程的相关基础知识以及新启线程的几种方法,本片将继续介绍线程的生命周期及方法详解. 一.线程的生命周期 在Thread代码中,线程的状态被分为6种 public enum State { /** * 尚未启动的线程处于此状态 */ NEW, /** * 在java虚拟机中执行或等待其他资源的线程处于此状态 */ RUNNABLE, /** * 被阻塞等待监视器锁定的线程处于此状态*/ BLOCKED, /** * 正在等待另一个线程执行特定动作的线程处于此状态*/ WAITING,…
public class JAVA { public static void main(String[] args) { System.out.println("----------------------"); System.out.println("|| 我要学会 ||"); System.out.println("|| JAVA语言 ||"); System.out.println("----------------------&…
前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险. 结合最近面试的经历,发现这条建议还是十分有用的,因为自己经常使用Executors提供的工厂方法创建线程池,所以忽略了线程池内部的实现. 特别是拒绝策略,面试被问到两次,还好因为这条建议,自己提前熟悉了一下ThreadPoolExecutor. Thr…
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Java Spring Boot VS .NetCore (三)Ioc容器处理 Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore Java Spring Boot VS .NetCore (五)MyBatis vs EFCore…
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://item.jd.com/12299018.html 本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持. 我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的.持久化的.跨程序的消息…
前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险. 结合最近面试的经历,发现这条建议还是十分有用的,因为自己经常使用Executors提供的工厂方法创建线程池,所以忽略了线程池内部的实现.特别是拒绝策略,面试被问到两次,因为使用Executors创建线程池不会传入这个参数而使用默认值所以我们常常忽略这一参…
多线程并发执行时,不同的线程执行的内容之间可能存在一些依赖关系,比如线程一执行a()方法和c()方法,线程二执行b()方法,方法a()必须在方法b()之前执行,而方法c()必须在方法b()之后执行.这时两个线程之间就需要协作才能完成这个任务,使两个线程协作有一个简单粗暴的方法,即监控布尔变量,代码如下: boolean finishA = false; boolean finishB = false; 线程一执行下面的代码: a(); finishA = true; while(!finishB…