使用Btrace来跟踪调试代码

有的时候在写程序的时候可能有些地方的日志没有照顾到,产生了bug,如果到了线上环境,有时候不得不停掉服务重新来加入日志来查看产生bug的地方,这个时候Btrace就派的上用场了,在VisualVM中可以很方便的调试目标程序,而对原有项目没有影响,当然也可以不用VisualVM而使用命令行来实现这个功能。Btrace是一个开源项目,项目托管在github上 使用VisualVM的Btrace插件最为方便,下面就写个小例子来熟悉一下 准备工作1.在visualvm官网下载visualVM可视化工具2.依次点击visualVM菜单栏的Tool->plugins打开插件窗口,选择 Btrace workBench 然后一路 next安装 目标程序 准备了一个简单的小程序:从键盘接收两个数字然后计算两个数字之和,主要目的是方便下一步用Btrace来调试打印出方法的参数的值,以及堆栈信息 12345678910111213141516171819202122232425package org.xuan.trace;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * Created by Xuan on 2016/9/10. */public class BTraceTest { public int add(int a ,int b){ return a+b; } public static void main(String[] args) throws IOException { BTraceTest traceTest= new BTraceTest(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0; i < 10; i++) { reader.readLine(); int a = (int)Math.round(Math.random()*1000); int b = (int)Math.round(Math.random()*1000); System.out.println(traceTest.add(a,b)); } }}

java

Java List实现group by

一般情况下我们可能很熟悉在数据库中使用group by来分组一些数据,但是如果数据来源不是数据库的话可能就需要通过在代码中实现group by了 例子:比如有一组书Book的集合,我们要按照书的类型(type)分组 12345678910111213package org.xuan;import lombok.AllArgsConstructor;import lombok.Data;@Data@AllArgsConstructorpublic class Book { private String name; private String type; private double price;} 增加几本书到list 123456789List <Book> bookList =Arrays.asList( new Book("java programming","java",123.1D), new Book("java in concurrency","java",123.2D), new Book("c++ primary","c++",123.3D), new Book("groovy in action","groovy",123.4D), new Book("effective java","java",123.5D), new Book("jvm in practice","java",123.6D), new Book("scala in action","scala",123.7D) );

java

Java NIO创建步骤

NIO创建过程一、打开ServerSocketChannel,用于监听客户端的连接 1ServerSocketChannel acceptSvr = ServerSocketChannel.open(); 二、绑定监听端口,设置连接为非阻塞模式 12acceptSvr.socket().bind(new InetSocketAddress(InetAddress.getByName("IP"),port));accptSvr.configureBlocking(false); 三、创建Reactor线程,创建多路复用器并启动线程 12Selector selector = Selector.open();new Thread(new ReactorTask()).start();

java

Java工程师(后端)技能树

我的Java技能树点亮之路 编程思想脱离于语言之上的一些不变的知识 设计模式,重构,Clean Code ,代码大全,Unix编程艺术 算法导论什么的就算了,但是至少得学会实现《数据结构》上的集中最基本的数据结构,java实现 理解 SOA面向服务架构 工具加成让自己的开发工具从小刀变成 Linux &shell &vim Ngix 工具类 google guava, apache-commons 构建工具maven,gradle Web容器 tomcat 版本控制git java8新特性 mysql&mariadb 数据库进阶,慢查询,数据库引擎,索引 熟悉Http,《图解HTTP》 了解使用noSql,mongodb

java

Java内存模型【译】

本文翻译自 Java Memory Model旨在加深自己对Java Memory Model (JMM)的理解。 The Java memory model specifies how the Java virtual machine works with the computer’s memory (RAM).The Java virtual machine is a model of a whole computer so this model naturally includes a memory model - AKA the Java memory model.It is very important to understand the Java memory model if you want to design correctly behaving concurrent programs.The Java memory model specifies how and when different threads can see values written to shared variables by other threads, and how to synchronize access to shared variables when necessary.The original Java memory model was insufficient, so the Java memory model was revised in Java 1.5. This version of the Java memory model is still in use in Java 8. Java内存模型详述了java虚拟机如何与物理机的RAM的一起工作的,java虚拟机是整个计算机的模型,所以这个模型自然包括内存模型,这个模型卡就是Java内存模型。如果你想正确的设计并发程序,知道Java内存模型是非常重要的java内存模型详解了多个不同的线程是何时而又如何写入一个共享的变量的,还有如何同步的访问一个共享变量。原来的Java内存模型是不足的,所以Java内存模型在java 5中重新修订了,这个版本的java内存模型一直在Java8中还在使用。 内部的java内存模型 The Java memory model used internally in the JVM divides memory between thread stacks and the heap. This diagram illustrates the Java memory model from a logic perspective:

java

cURL命令的使用

Linux curl命令的使用 参考官方文档 https://curl.haxx.se/docs/manpage.html 一、什么是cURL wikipedia中的解释如下: cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。 cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。 简单的说,cURL就是把发出请求然后得到响应并把响应数据显示到标准输出上的一个命令行工具。 语法: curl [option] [URL] 二、cURL的用法1. 保存curl的结果到文件curl -o [filename] [URL] 比如要保存 http://zeusjava.com 到blog.html中,可以使用 curl -o blog.html http://zeusjava.com 当然,也可以直接用 curl http://zeusjava.com >blog.html 1$ curl -o blog.html http://zeusjava.com 使用 -o 也可以用于下载文件 curl -o android-studio-2.0.exe https://dl.google.com/dl/android/studio/install/2.0.0.20/android-studio-bundle-143.2739321-windows.exe 使用 -O可以将下载的文件名自动命名为服务器端文件的名字 curl -O https://dl.google.com/dl/android/studio/install/2.0.0.20/android-studio-bundle-143.2739321-windows.exe

技术随笔

Spring MVC源码探究

作为一名合格的java程序员,要多深入学习一些框架,理解框架的设计的方法,背后的原理,spring mvc框架中使用了很多设计模式,比如策略模式,Spring MVC中大量使用了策略模式,像HandlerMapping接口,HandlerAdapter接口,ViewResolver接口都使用了策略模式,在执行handler和Interceptor拦截器的时候使用了责任链模式,在执行handler的时候会用到适配器模式等等,可以说沉淀了很多前辈的精华,想成为架构师的话,学习源码必不可少,下面就围绕着Spring MVC 的前端控制器DispatcherServlet一步一步的来学习Spring MVC的源码。 1 web.xml中DispatcherServlet的配置web.xml中的Spring MVC的前端控制器DispatcherServlet的配置,所有后端Controller的请求都由这个DispatcherServlet分发。 123456789101112<servlet> <servlet-name>MySpringServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MySpringServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

spring框架

Java集合中的Fail-fast和Fail-Safe机制

1.何为Fail-fast和Fail-Safe机制?java.util包里的Iterator 抛出 ConcurrentModificationException异常, 在集合迭代的时候被集合的add方法或者 remove方法调用。fail-fast 指java的集合的一种错误机制,当多个线程对集合修改操作的时候就可能抛出ConcurrentModificationException异常。 java.util.concurrent包里的Iterator 通过迭代一个集合的snapshot 允许并发修改集合,但是在迭代器创建之后可能不反映Collection更新。fail-safe机制意味着多个线程在操作同一个集合的时候,不会出现ConcurrentModificationException异常,但是需要复制集合获得集合的快照,所以性能上开销会比非同步的集合开销要大。 多线程环境下用java.util.concurrent包里的集合替代 java.util包里的集合,比如 CopyOnWriteList=>ArrayList,ConcurrentHashMap=>HashMap etc. 2.JDK中的源码分析下面代码是JDK1.7源码中ArrayList中的ListIterator,当Iterator创建时,当前的计数器modCount 赋值给Iterator对象,注意到modCount是一个 transient类型的成员变量,transient说明了计数器将不被序列化。 protected transient int modCount = 0; modCount用来记录List修改的次数的计数器,每修改一次(添加/删除等操作),将modCount+1,例如 add()方法: 1234567public void add(int index, E element) { rangeCheckForAdd(index); checkForComodification(); l.add(index+offset, element); this.modCount = l.modCount; size++; }

java

学习Java的NIO

重要的概念 什么是NIO?NIO是从java 1.4 开始引入的一个新的 IO API。 Channel、Buffer、Selector是NIO的核心部分。 IO通过字节流和字符流操作数据,NIO基于通道(Channel)和缓冲区(Buffer)数据 Channel&BufferChannel数据总是由通道到缓冲区(Read),或者由缓冲区到通道(write) 其中Channel的几个实现 FileChannel DatagramChannel SocketChannel ServerSocketChannel 分别对应文件IO/UDP/TCP网络IO. 下面是一个简单的例子实现,从本地文件系统读取数据到Buffer中。

java

Scala中的特质

特质的构造顺序 1. 超类的构造器 2. 特质由左至右构造 3. 每个特质中,父特质先被构造 4. 多个特质公用一个父特质,而那个特质已经被构造,则不会被再次构造 5. 所有特质构造完毕,子类被构造 eg: 其中 FileLogger和ShortLogger都继承Logger特质 1calss SavingsAccount extends Account with FileLogger with ShortLogger 构造顺序 1.Account(超类) 2.Logger(第一个特质的父特质) 3.FileLogger(第一个特质) 4.ShortLogger(第一个特质) 5.SavingAccount(类)

scala
156789

本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量