w1100n
This site is best viewed in Google Chrome
wiloon, 3/31/2017 15:01

iowait的含义为有进程在等io操作结束(备份进程),并且在等待io操作结束的过程中,无其他进程占用cpu,cpu处于空闲状态,故根据iowait参数无从判断io负载情况,还需要通过iostat来判断备份期间io负载情况(如备份期间磁盘写性能是否已达瓶颈等)

wiloon, 3/31/2017 14:58

http://www.cnblogs.com/peida/p/Guava_Cache.html 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。缓存的作用就是将这些来自不易的数据保存在内存中,当有其他线程或者客户端需要查询相同的数据资源时,直接从缓存的内存块中返回数据,这样不但可以提高系统的响应时间,同时也可以节省对这些数据的处理流程的资源消耗,整体上来说,系统性能会有大大的提升。 缓存在很多系统和架构中都用广泛的应用,例如: 1.CPU缓存 2.操作系统缓存 3.本地缓存 4.分布式缓存 5.HTTP缓存 6.数据库缓存 等等,可以说在计算机和网络领域,缓存无处不在。可以这么说,只要有硬件性能不对等,涉及到网络传输的地方都会有缓存的身影。 Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。 Guava Cache有两种创建方式: 1. cacheLoader 2. callable callback 通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。 cacheLoader方式实现实例: @Test public void TestLoadingCache() throws Exception{ LoadingCache<String,String> cahceBuilder=CacheBuilder .newBuilder() .build(new CacheLoader<String, String>(){ @Override public … Continue reading

wiloon, 3/31/2017 9:31

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。相比top,vmstat可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。 -a:显示活动内页; -f:显示启动后创建的进程总数; -m:显示slab信息; -n:头信息仅显示一次; -s:以表格方式显示事件计数器和内存状态; -d:报告磁盘状态; -p:显示指定的硬盘分区状态; -S:输出信息的单位。 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如: r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。 b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。 swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。 free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。 buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存;表示块设备(block device)所占用的缓存页,包括:直接读写块设备、以及文件系统元数据(metadata)比如SuperBlock所使用的缓存页; buffers are only used for file metadata (inodes, etc) and data from raw block devices. It’s accessed via block … Continue reading

wiloon, 3/31/2017 9:24

http://blog.csdn.net/zy_27_ok/article/details/8462385 最近在网上看到一些人讨论到Java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些题目,很多人感到很迷惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们以为这个方法返回的是操纵系统的剩余可用内存,实在根本就不是这样的。这三个方法反映的都是java这个进程的内存情 况,跟操纵系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。 maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操纵系统那里挖到的最大的内存,以字节为单位,假如在运行java程 序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操纵系统那里挖到的最大的内存。假如添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。 totalMemory()这个方法返回的是java虚拟机现在已经从操纵系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的 所有 内存。假如在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操纵系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。假如用了-Xms参数,程序在启动的时候就会无条件的从操纵系统中挖- Xms后面定义的内存数,然后在这些内存用的差未几的时候,再往挖。 freeMemory()是什么呢,刚才讲到假如在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的 从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是假如你在运行java程序的时候使用了-Xms,这个时候由于程 序在启动的时候就会无条件的从操纵系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。 把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。 public?class?Untitled1?{?????? ??public?Untitled1()?{}?????? ??public?static?void?main(String[]?args)?{?? ????System.out.println(Runtime.getRuntime().freeMemory());?? … Continue reading

wiloon, 3/30/2017 15:30

DestroyJavaVM is a thread that unloads the Java VM on program exit. Most of the time it should be waiting, until apocalypse of your VM. Signal Dispatcher is a thread that handles the native signals sent by the OS to … Continue reading

wiloon, 3/30/2017 14:49

之前并不知道Java中如何能够获取当前进程(也就是包含当前Java程序的JVM所在进程)的进程ID,还以为要通过JNI或者通过Runtime.exec执行shell命令等方式才能获取到当前进程的进程ID,今天在偶然中看到一种在Java程序里,获取当前进程ID的方法,记录下来,以后应该会用到:) 首先,从JDK1.5之后,Java开始提供包:java.lang.management java.lang.management 提供了一系列的用来在运行时管理和监督JVM和OS的管理接口。 今天我将用到的就是这个包中的一个类:ManagementFactory。 当然,这只是java.lang.management包中的一个小功能,该包还提供了很多其他的管理接口,参照java doc如下: Interface Summary ClassLoadingMXBean The management interface for the class loading system of the Java virtual machine. CompilationMXBean The management interface for the compilation system of the Java virtual machine. GarbageCollectorMXBean The management interface … Continue reading

wiloon, 3/30/2017 14:06

即时编译器 Java虚拟机中内置了两个即时编译器,分别为Client和Server或则叫C1和C2. C1编译器将字节码编译为本地代码,进行简单可靠的优化,C2编译器则会启动一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。C1和C2都是编译一些热点代码(多次调用的方法或者多次执行的循环体),因此在编译前,首先要进行热点探测,HotSpot虚拟机中使用的是基于计数器的热点探测方法。 它为每个方法都准备了两个计数器,方法调用计数器和回边计数器。 方法调用计数器统计的并不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间内方法被调用的次数。当超过一定的时间限度,如果方法调用次数仍然不足以让它提交给即时编译器,那这个方法的调用计数器就会衰减一般,这个过程称为方法调用计数器热度的衰减。 回边计数器统计的是一个方法中循环体代码执行的次数,它没有热度衰减。建立回边计数器统计的目的是为了处罚OSR编译,OSR即栈上替换,也就是编译发生在方法执行过程之中。   http://blog.csdn.net/tingfeng96/article/details/52261219 http://blog.csdn.net/zhuyijian135757/article/details/38391785

wiloon, 3/30/2017 13:12

http://blog.csdn.net/carolzhang8406/article/details/6726589 一、扫描控制台输入 这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了。 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。 /** * 扫描控制台输入 * * @author leizhimin 2009-7-24 11:24:47 */ public class TestScanner { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println(“请输入字符串:”); while (true) { String line = s.nextLine(); if (line.equals(“exit”)) … Continue reading

wiloon, 3/27/2017 13:34

http://blog.csdn.net/lihao21/article/details/48370687 Redis为我们提供了publish/subscribe(发布/订阅)功能。我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时,redis就会通知我们,这样我们可以收到别人发布的消息。 作为Java的redis客户端,Jedis提供了publish/subscribe的接口。本文讲述如何使用Jedis来实现redis的publish/subscribe。 定义Subscriber类 Jedis定义了抽象类JedisPubSub,在这个类中,定义publish/subsribe的回调方法。通过继承JedisPubSub类并重新实现这些回调方法,当publish/subsribe事件发生时,我们可以定制自己的处理逻辑。 在以下例子中,我们定义了Subscriber类,这个类继承了JedisPubSub类,并重新实现了其中的回调方法。 Subscriber.java import redis.clients.jedis.JedisPubSub; public class Subscriber extends JedisPubSub { public Subscriber() { } public void onMessage(String channel, String message) { System.out.println(String.format(“receive redis published message, channel %s, message %s”, channel, message)); } public void onSubscribe(String … Continue reading

wiloon, 3/26/2017 17:13

http://blog.csdn.net/liangxanhai/article/details/7767430   pthread_create函数的详细讲解(包括向线程函数传递参数详解) 标签: threadinclude编译器nulllinuxgcc 2012-07-20 14:52 56250人阅读 评论(4) 收藏 举报 分类: unix高级编程学习(6) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] pthread_create是UNIX环境创建线程函数头文件 #include<pthread.h>函数声明 int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);返回值 若成功则返回0,否则返回出错编号 返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。 linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。参数 … Continue reading

wiloon, 3/26/2017 17:09

http://www.cnblogs.com/shangxiaofei/p/5762895.html —->关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的话耗时不好说。 —->关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置-Xss属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。 —>对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被 清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。 http://www.cnblogs.com/ktgu/p/3529144.html 多线程的代价      使用多线程往往可以获得更大的吞吐率和更短的响应时间,但是,使用多线程不一定就比单线程程序跑的快,这取决于我们程序设计者的能力以及应用场景的不同。不要为了多线程而多线程,而应考虑具体的应用场景和开发实力,使用多线程就是希望能够获得更快的处理速度和利用闲置的处理能力,如果没带来任何好处还带来了复杂性和一些定时炸弹,那还傻逼了吗?只有在使用多线程给我们带来的好处远大于我们付出的代价时,才考虑使用多线程,有时候可能引入多线程带来的性能提升抵不过多线程而引入的开销,一个没有经过良好并发设计得程序也可能比使用单线程还更慢。 多线程给我们带来的代价 设计更复杂      多线程程序在访问共享数据的时候往往需要我们很小心的处理,否则就会出现难以发现的BUG,一般地,多线程程序往往比单线程程序设计会更加复杂(尽管有些单线程处理程序可能比多线程程序要复杂),而且错误很难重现(因为线程调度的无序性,某些bug的出现依赖于某种特定的线程执行时序)。 上下文切换的开销      线程是由CPU进行调度的,CPU的一个时间片内只执行一个线程上下文内的线程,当CPU由执行线程A切换到执行线程B的过程中会发生一些列的操作,这些操作主要有”保存线程A的执行现场“然后”载入线程B的执行现场”,这个过程称之为“上下文切换(context switch)”,这个上下文切换过程并不廉价,如果没有必要,应该尽量减少上下文切换的发生。 增加更多的资源消耗      除了CPU执行上下文切换的消耗以外,线程的执行还将有其他一些资源的消耗,比如:内存同步的开销(线程需要一些内存在维持线程本地栈,每个线程都有本地独立的栈用以存储线程专用数据),上下文切换的开销(前面已经讲过),线程创建和消亡的开销,以及调度的开销(占用操作系统的一些资源来管理和协调线程),我们可以创建100个线程让他们什么都不做,看看他们消耗了多少内存。 上下文切换      多数人认为使用多线程一定会比单线程执行速度快,但其实未必,因为多线程应用程序会带来额外的开销和竞争问题,他们都可能会拖慢系统的执行速度。这些因素包括:对IO设备的竞争,对锁的竞争,以及CPU对线程执行上下文的频繁切换等。      目前流行的CPU在同一时间内只能运行一个线程,超线程的处理器(包括多核处理器)可以同一时间运行多个线程,linux将多核处理器当作多个单独CPU来识别的。每个进程都会分到CPU的时间片来运行,当某个进程(线程是轻量级进程,他们是可以并行运行的,并且共享地使用他们所属进程的地址空间资源,比如:内存空间或其他资源)当进程用完时间片或者被另一个优先级更高的进程抢占的时候,CPU会将该进程备份到CPU的运行队列中,其他进程被调度在CPU上运行,这个进程切换的过程被称作“上下文切换”,过多的上下文切换会造成系统很大的开销。      在Linux中可以使用vmstat来观察上下文切换的次数,一般来说,空闲的系统,每秒上下文切换次数大概在1500以下。 引起上下文切换的原因 时间片用完,CPU正常调度下一个任务 被其他优先级更高的任务抢占 执行任务碰到IO阻塞,调度器挂起当前任务,切换执行下一个任务 … Continue reading

wiloon, 3/26/2017 13:28

公平锁:每个线程抢占锁的顺序为先后调用lock方法的顺序依次获取锁,类似于排队吃饭。 非公平锁:每个线程抢占锁的顺序不定,谁运气好,谁就获取到锁,和调用lock方法的先后顺序无关,类似于堵车时,加塞的那些XXXX。 如果在绝对时间上,先对锁进行获取的请求一定被先满足,那么这个锁是公平的,反之,是不公平的,也就是说等待时间最长的线程最有机会获取锁,也可以说锁的获取是有序的。 公平的锁机制往往没有非公平的效率高,因为公平的获取锁没有考虑到操作系统对线程的调度因素,这样造成JVM对于等待中的线程调度次序和操作系统对线程的调度之间的不匹配。对于锁的快速且重复的获取过程中,连续获取的概率是非常高的,而公平锁会压制这种情况,虽然公平性得以保障,但是响应比却下降了,但是并不是任何场景都是以TPS作为唯一指标的,因为公平锁能够减少“饥饿”发生的概率,等待越久的请求越是能够得到优先满足。 http://www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer http://www.infoq.com/cn/articles/java8-abstractqueuedsynchronizer AbstractQueuedSynchronizer的介绍和原理分析 https://www.zhihu.com/question/36964449 ReentrantLock(重入锁)以及公平性

wiloon, 3/26/2017 13:25

编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。 注意,这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。 http://www.infoq.com/cn/articles/java-memory-model-2 http://tech.meituan.com/java-memory-reordering.html

wiloon, 3/26/2017 11:00

http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和volatile 。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。 synchronized 快速回顾 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。 原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。 可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为。一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,但是如果开发人员使用了同步,如下面的代码所示,那么运行库将确保某一线程对变量所做的更新先于对现有synchronized 块所进行的更新,当进入由同一监控器(lock)保护的另一个 synchronized 块时,将立刻可以看到这些对变量所做的更新。类似的规则也存在于 volatile 变量上。 synchronized (lockObject) { // update object state } 所以,实现同步操作需要考虑安全更新多个共享变量所需的一切,不能有争用条件,不能破坏数据(假设同步的边界位置正确),而且要保证正确同步的其他线程可以看到这些变量的最新值。通过定义一个清晰的、跨平台的内存模型(该模型在 JDK 5.0 中做了修改,改正了原来定义中的某些错误),通过遵守下面这个简单规则,构建“一次编写,随处运行”的并发类是有可能的: 不论什么时候,只要您将编写的变量接下来可能被另一个线程读取,或者您将读取的变量最后是被另一个线程写入的,那么您必须进行同步。 不过现在好了一点,在最近的 JVM 中,没有争用的同步(一个线程拥有锁的时候,没有其他线程企图获得锁)的性能成本还是很低的。(也不总是这样;早期 JVM 中的同步还没有优化,所以让很多人都这样认为,但是现在这变成了一种误解,人们认为不管是不是争用,同步都有很高的性能成本。) 对 synchronized 的改进 … Continue reading

wiloon, 3/25/2017 19:12

http://www.meishij.net/zuofa/ganshaonangua.html   南瓜切块 不粘锅加油烧热,入南瓜丁小火煎至表面微焦 生抽,老抽,糖,醋调成烧汁(醋只要加一点点,只是增香,不能吃出酸味来。建议只加生抽,我加了老抽,颜色深了点) 倒入烧汁,大火收汁,并不停翻炒,使南瓜丁均匀裹上烧汁 出锅时多撒些葱花,香喷喷的干烧南瓜就做好了 这个菜做法很简单,但味道却非常的好,至少是我家人喜欢的!趁热吃,真的是香味扑鼻! 只要注意三个要点,做出的干烧南瓜就一定很好吃。第一就是煎的部分,南瓜丁可以切大一些,也不能太薄,这样煎的时候不容易碎,也可以煎的久一些。要煎到南瓜外面都结一层焦皮,这样最后吃起来就是外焦里酥的口感! 还有就是烧汁的调配和使用,烧汁可以根据口感调,我做的就是偏甜一些的口感,但这里面的醋一定不能省,加了少许醋烧出来的南瓜非常的香。不过醋只是增香,不能加太多,否则就有酸味了。烧汁也一定要收干,使其厚厚的包裹在南瓜上,这样才够味,好吃!也才有干烧的感觉! 最后出锅撒的葱花也是功不可没,一定要多撒些,葱香和酱香混合在一起的味道,真的是美妙极了!

wiloon, 3/25/2017 17:11

  默认枚举实例的创建是线程安全的 通过enum关键字来实现枚举,在枚举中需要注意的有: 1. 枚举中的属性必须放在最前面,一般使用大写字母表示 2. 枚举中可以和java类一样定义方法 3. 枚举中的构造方法必须是私有的 通过一个java类来模拟枚举的功能: package org.lkl.imitate_enum; public abstract class WeekDay { public static final WeekDay SUN = new WeekDay() { @Override public WeekDay nextDay() { return MON; } }; public static final WeekDay MON = … Continue reading

wiloon, 3/25/2017 12:15

-XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath JVM 在发生内存溢出时自动的生成堆内存快照。有了这个参数,当我们不得不面对内存溢出异常的时候会节约大量的时间。默认情况下,堆内存快照会保存在 JVM 的启动目录下名为 java_pid.hprof 的文件里(在这里 就是 JVM 进程的进程号)。也可以通过设置 – XX:HeapDumpPath= 来改变默认的堆内存快照生成路径, 可以是相对或者绝对路径。 -verbose.gc开关可显示GC的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。 -verbose:gc – Same as “-XX:+PrintGC”. -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log 将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定 -XX:+PrintGCDetails //包含-XX:+PrintGC 只要设置-XX:+PrintGCDetails 就会自动带上-verbose:gc和-XX:+PrintGC -XX:+UseSerialGC – Force HotSpot to use Serial Collector. -XX:+PrintGC – Print a … Continue reading

wiloon, 3/25/2017 10:32

http://blog.sina.com.cn/s/blog_605f5b4f01015k56.html http://man.linuxde.net/stat   在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。但如果文件创建后就没有修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间,这个基本不太可能。 与文件相关的几个时间: 1、访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件使用more命令。ls、stat命令都不会修改文件的访问时间。 2、修改时间,对文件内容修改一次,这个时间就会更新。比如:vi后保存文件。ls -l列出的时间就是这个时间。 3、状态改变时间。通过chmod命令更改一次文件属性,这个时间就会更新。查看文件的详细的状态、准确的修改时间等,可以通过stat命令 文件名。 比如: [jing@zhjh c]$ stat temp.c 引用: File: ‘temp.c’ Size: 66 Blocks: 8 IO Block: 4096 \u4e00\u822c\u6587\u4ef6 Device: 807h/2055d Inode: 1191481 Links: 1 Access: (0664/-rw-rw-r–) Uid: ( 500/ jing) Gid: ( … Continue reading

wiloon, 3/25/2017 10:00

https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/ http://www.ruanyifeng.com/blog/2012/04/functional_programming.html http://www.jianshu.com/p/5b800057f2d8

wiloon, 3/25/2017 9:59

https://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ http://blog.ubone.com/blog/2014/11/18/java-7de-6ge-xin-te-xing/   http://www.infoq.com/cn/articles/jdk7-garbage-first-collector

next page
辽ICP备14012896