urxvt

urxvt urxvt is a highly customizable terminal emulator. # install sudo pacman -S rxvt-unicode #start rxvt-unicode urxvt # 没有的话就创建这个文件, urxvt 启动的时候自动加载 vim ~/.Xresources ! 起始的行是注释 !!$HOME/.Xresources URxvt.preeditType:Root !!调整此处设置输入法 URxvt.inputMethod:fcitx !!颜色设置 URxvt.depth:32 !!中括号内数表示透明度 URxvt.inheritPixmap:true URxvt.background:#000000 URxvt.foreground:#ffffff URxvt.colorBD:Gray95 URxvt.colorUL:Green URxvt.color1:Red2 URxvt.color4:RoyalBlue URxvt.color5:Magenta2 URxvt.color8:Gray50 URxvt.color10:Green2 URxvt.color12:DodgerBlue URxvt.color14:Cyan2 URxvt.color15:Gray95 !!URL操作 URxvt.urlLauncher:chromium URxvt.matcher.button:1 Urxvt.perl-ext-common:matcher !!滚动条设置 URxvt.scrollBar:False URxvt.scrollBar_floating:False URxvt.scrollstyle:plain !!滚屏设置 URxvt.mouseWheelScrollPage:True URxvt.scrollTtyOutput:False URxvt.scrollWithBuffer:True URxvt.scrollTtyKeypress:True !!光标闪烁 URxvt.cursorBlink:True URxvt.saveLines:3000 !!边框 URxvt.borderLess:False !!字体设置 Xft.dpi:96 URxvt.font:xft:Source Code Pro:antialias=True:pixelsize=18,xft:WenQuanYi Zen Hei:pixelsize=18 ...

2017-02-10 · 1 min · 133 words · -

进程调度

进程调度 Linux 进程调度 操作系统要实现多进程,进程调度必不可少。进程调度是对TASK_RUNNING状态的进程进行调度 (参见《linux进程状态浅析》) 。如果进程不可执行 (正在睡眠或其他) ,那么它跟进程调度没多大关系。 所以,如果你的系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程。那么进程调度也就不会太重要。哪个进程可执行,就让它执行去,没有什么需要多考虑的。 反之,如果系统负载非常高,时时刻刻都有N多个进程处于可执行状态,等待被调度运行。那么进程调度程序为了协调这N个进程的执行,必定得做很多工作。协调得不好,系统的性能就会大打折扣。这个时候,进程调度就是非常重要的。 尽管我们平常接触的很多计算机 (如桌面系统、网络服务器、等) 负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。 当然,这些设计对于低负载 (且没有什么实时性要求) 的环境,没多大用。极端情况下,如果CPU的负载始终保持0或1 (永远都只有一个进程或没有进程需要在CPU上运行) ,那么这些设计基本上都是徒劳的。 优先级 现在的操作系统为了协调多个进程的"同时"运行,最基本的手段就是给进程定义优先级。定义了进程的优先级,如果有多个进程同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠结的了。 那么,进程的优先级该如何确定呢?有两种方式: 由用户程序指定、由内核的调度程序动态调整。 (下面会说到) linux内核将进程分成两个级别: 普通进程和实时进程。实时进程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。 实时进程的调度 实时,原本的涵义是"给定的操作一定要在确定的时间内完成"。重点并不在于操作一定要处理得多快,而是时间要可控 (在最坏情况下也不能突破给定的时间) 。 这样的"实时"称为"硬实时",多用于很精密的系统之中 (比如什么火箭、导弹之类的) 。一般来说,硬实时的系统是相对比较专用的。 像linux这样的通用操作系统显然没法满足这样的要求,中断处理、虚拟内存、等机制的存在给处理时间带来了很大的不确定性。硬件的cache、磁盘寻道、总线争用、也会带来不确定性。 比如考虑"i++;“这么一句C代码。绝大多数情况下,它执行得很快。但是极端情况下还是有这样的可能: i的内存空间未分配,CPU触发缺页异常。而linux在缺页异常的处理代码中试图分配内存时,又可能由于系统内存紧缺而分配失败,导致进程进入睡眠; 代码执行过程中硬件产生中断,linux进入中断处理程序而搁置当前进程。而中断处理程序的处理过程中又可能发生新的硬件中断,中断永远嵌套不止……;等等…… 而像linux这样号称实现了"实时"的通用操作系统,其实只是实现了"软实时”,即尽可能地满足进程的实时需求。 如果一个进程有实时需求 (它是一个实时进程) ,则只要它是可执行状态的,内核就一直让它执行,以尽可能地满足它对CPU的需要,直到它完成所需要做的事情,然后睡眠或退出 (变为非可执行状态) 。 而如果有多个实时进程都处于可执行状态,则内核会先满足优先级最高的实时进程对CPU的需要,直到它变为非可执行状态。于是,只要高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到CPU;只要一直有实时进程处于可执行状态,普通进程就一直不能得到CPU。 (后来,内核添加了/proc/sys/kernel/sched_rt_runtime_us和/proc/sys/kernel/sched_rt_period_us两个参数,限定了在以sched_rt_period_us为周期的时间内,实时进程最多只能运行sched_rt_runtime_us这么多时间。这样就在一直有实时进程处于可执行状态的情况下,给普通进程留了一点点能够得到执行的机会。参阅《linux组调度浅析》。) 那么,如果多个相同优先级的实时进程都处于可执行状态呢?这时就有两种调度策略可供选择: SCHED_FIFO: 先进先出。直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。在这种策略下,先来的进程可以行sched_yield系统调用,自愿放弃CPU,以让权给后来的进程; SCHED_RR: 轮转调度。内核为实时进程分配时间片,在时间片用完时,让下一个进程使用CPU; 强调一下,这两种调度策略仅仅针对于相同优先级的多个实时进程同时处于可执行状态的情况。 在linux下,用户程序可以通过sched_setscheduler系统调用来设置进程的调度策略以及相关调度参数;sched_setparam系统调用则只用于设置调度参数。这两个系统调用要求用户进程具有设置进程优先级的能力 (CAP_SYS_NICE,一般来说需要root权限) (参阅capability相关的文章) 。 通过将进程的策略设为SCHED_FIFO或SCHED_RR,使得进程变为实时进程。而进程的优先级则是通过以上两个系统调用在设置调度参数时指定的。 对于实时进程,内核不会试图调整其优先级。因为进程实时与否?有多实时?这些问题都是跟用户程序的应用场景相关,只有用户能够回答,内核不能臆断。 综上所述,实时进程的调度是非常简单的。进程的优先级和调度策略都由用户定死了,内核只需要总是选择优先级最高的实时进程来调度执行即可。唯一稍微麻烦一点的只是在选择具有相同优先级的实时进程时,要考虑两种调度策略。 普通进程的调度 实时进程调度的中心思想是,让处于可执行状态的最高优先级的实时进程尽可能地占有CPU,因为它有实时需求;而普通进程则被认为是没有实时需求的进程,于是调度程序力图让各个处于可执行状态的普通进程和平共处地分享CPU,从而让用户觉得这些进程是同时运行的。 与实时进程相比,普通进程的调度要复杂得多。内核需要考虑两件麻烦事: 一、动态调整进程的优先级 按进程的行为特征,可以将进程分为"交互式进程"和"批处理进程": 交互式进程 (如桌面程序、服务器、等) 主要的任务是与外界交互。这样的进程应该具有较高的优先级,它们总是睡眠等待外界的输入。而在输入到来,内核将其唤醒时,它们又应该很快被调度执行,以做出响应。比如一个桌面程序,如果鼠标点击后半秒种还没反应,用户就会感觉系统"卡"了; 批处理进程 (如编译程序) 主要的任务是做持续的运算,因而它们会持续处于可执行状态。这样的进程一般不需要高优先级,比如编译程序多运行了几秒种,用户多半不会太在意; 如果用户能够明确知道进程应该有怎样的优先级,可以通过nice、setpriority (非实时进程优先级的设置) 系统调用来对优先级进行设置。 (如果要提高进程的优先级,要求用户进程具有CAP_SYS_NICE能力。 然而应用程序未必就像桌面程序、编译程序这样典型。程序的行为可能五花八门,可能一会儿像交互式进程,一会儿又像批处理进程。以致于用户难以给它设置一个合适的优先级。再者,即使用户明确知道一个进程是交互式还是批处理,也多半碍于权限或因为偷懒而不去设置进程的优先级。 (你又是否为某个程序设置过优先级呢?) ...

2017-02-10 · 2 min · 385 words · -

mmap

mmap mmap 函数是 unix/linux 下的系统调用 mmap() 函数用来将文件或者设备映射到内存中。 mmap 的特点是按需调页。最开始只申请 vma(Virtual Memory Area),并不调真正的页。当对某些页进行引用的时候,会引起一个缺页中断,再将页面调入到内存当中,这样避免了对内存的浪费。 内存映射, 是将用户空间的一段内存区域映射到内核空间, 映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。 那么对于 内核空间 <—-> 用户空间 两者之间需要大量数据传输等操作的话效率是非常高的。 mmap 是一种内存映射文件的方法, 即将一个文件或者其它对象映射到进程的地址空间, 实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上, 即完成了对文件的操作而不必再调用 read, write 等系统调用。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享 mmap 优点 对文件的读取操作跨过了页缓存, 减少了数据的拷贝次数, 用内存读写取代I/O读写, 提高了文件读取效率。 实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内, 从而被对方空间及时捕捉。 提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动, 达到进程间通信和进程间共享的目的。 同时, 如果进程A和进程B都映射了区域C, 当A第一次读取C 时通过缺页从磁盘复制文件页到内存中;但当B 再读C 的相同页面时, 虽然也会产生缺页异常,但是不再需要从磁盘中复制文件过来, 而可直接使用已经保存在内存中的文件数据。 可用于实现高效的大规模数据传输。 内存空间不足,是制约大数据操作的一个方面,解决方案往往是借助硬盘空间协助操作,补充内存的不足。但是进一步会造成大量的文件I/O操作,极大影响效率。这个问题可以通过mmap映射很好的解决。换句话说,但凡是需要用磁盘空间代替内存的时候, mmap 都可以发挥其功效。 操作文件就像操作内存一样,适合于对较大文件的读写。 用户也可创建匿名内存映射, 该映射没有对应的文件, 可用于存放程序数据。在 Linux中,若通过 malloc()请求一大块内存,C 运行库将创建一个匿名内存映射,而不使用堆内存。“大块” 意味着比阈值 MMAP_THRESHOLD还大,缺省为128KB,可通过 mallopt()调整。 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 prot: 期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起 PROT_EXEC //页内容可以被执行 PROT_READ //页内容可以被读取 PROT_WRITE //页可以被写入 PROT_NONE //页不可访问 ...

2017-02-10 · 2 min · 270 words · -

maven dependency version range

maven dependency version range http://maven.apache.org/components/enforcer/enforcer-rules/versionRanges.html Version Range Specification The [RequireMavenVersion][1] and [RequireJavaVersion][2] rules use the [standard Maven version range syntax][3]{.externalLink} with one minor change for ease of use (denoted with *): Range Meaning 1.0 x >= 1.0 * The default Maven meaning for 1.0 is everything (,) but with 1.0 recommended. Obviously this doesn't work for enforcing versions here, so it has been redefined as a minimum version. (,1.0] x <= 1.0 (,1.0) x < 1.0 [1.0] x == 1.0 [1.0,) x >= 1.0 (1.0,) x > 1.0 (1.0,2.0) 1.0 < x < 2.0 [1.0,2.0] 1.0 <= x <= 2.0 (,1.0],[1.2,) x <= 1.0 or x >= 1.2. Multiple sets are comma-separated (,1.1),(1.1,) x != 1.1 http://maven.apache.org/components/enforcer/enforcer-rules/requireMavenVersion.html http://maven.apache.org/components/enforcer/enforcer-rules/requireJavaVersion.html http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges

2017-02-08 · 1 min · 119 words · -

java jmx

java jmx 在 Java 程序的运行过程中,对 JVM 和系统的监测一直是 Java 开发人员在开发过程所需要的。一直以来,Java 开发人员必须通过一些底层的 JVM API,比如 JVMPI 和 JVMTI 等,才能监测 Java 程序运行过程中的 JVM 和系统的一系列情况,这种方式一直以来被人所诟病,因为这需要大量的 C 程序和 JNI 调用,开发效率十分低下。于是出现了各种不同的专门做资源管理的程序包。为了解决这个问题,Sun 公司也在其 Java SE 5 版本中,正式提出了 Java 管理扩展 (Java Management Extensions,JMX) 用来管理检测 Java 程序 (同时 JMX 也在 J2EE 1.4 中被发布) 。 JMX 的提出,让 JDK 中开发自检测程序成为可能,也提供了大量轻量级的检测 JVM 和运行中对象 / 线程的方式,从而提高了 Java 语言自己的管理监测能力。 开启JMX,用 JVisvualVM, jmc 或 jconsole 连接JVM oracle jdk 自带JVisvualVM, jmc, openjdk 只有jconsole 通过jcmd开启 - 不需要重启JVM: # jmxremote.rmi.port: 监听jmx客户端的端口 # jmxremote.rmi.port: jmx数据传输端口,如果此项未配置,jmx会随机开一个新端口跟客户端传输数据. jcmd <PID> ManagementAgent.start \ jmxremote.port=1099 \ jmxremote.rmi.port=1099 \ jmxremote.ssl=false \ jmxremote.authenticate=false 关闭jmx jcmd <PID> ManagementAgent.stop 通过JVM启动参数开启,需要重启JVM. # JVM command line option: -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.54 注: ...

2017-02-07 · 1 min · 127 words · -

nice, cpulimit, cgroups 限制 cpu 占用率

nice, cpulimit, cgroups 限制 cpu 占用率 3 种控制进程运行时间的方法: 使用 nice 命令手动降低任务的优先级。 使用 cpulimit 命令不断的暂停进程,以控制进程所占用处理能力不超过特定限制。 使用linux内建的control groups (控制组) 功能,它提供了限制进程资源消耗的机制。 模拟高cpu占用率 https://caffinc.github.io/2016/03/cpu-load-generator/ nice命令 nice -n 10 bash # 不带后缀,查看当前nice值 nice 下面介绍一下nice命令的使用方法,nice命令可以修改进程的优先级,这样就可以让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤为有用。 nice值的取值范围是[-20,19],-20表示最高优先级,而19表示最低优先级。 Linux进程的默认nice值为0。使用nice命令 (不带任何参数时) 可以将进程的nice值设置为10。这样调度器就会将此进程视为较低优先级的进程,从而减少cpu资源的分配。 下面来看一个例子,我们同时运行两个 matho-primes 进程,一个使用nice命令来启动运行,而另一个正常启动运行: nice matho-primes 0 9999999999 > /dev/null & matho-primes 0 9999999999 > /dev/null & 再运行top命令。 看到没,正常运行的进程 (nice值为0) 获得了更多的cpu运行时间,相反的,用nice命令运行的进程占用的cpu时间会较少 (nice值为10) 。 在实际使用中,如果你要运行一个CPU密集型的程序,那么最好用nice命令来启动它,这样就可以保证其他进程获得更高的优先级。 也就是说,即使你的服务器或者台式机在重载的情况下,也可以快速响应。 renice renice -n 1 -p 14459 nice 还有一个关联命令叫做 renice,它可以在运行时调整进程的 nice 值。使用 renice 命令时,要先找出进程的 PID。下面是一个例子: ...

2017-02-07 · 3 min · 505 words · -

Retained Heap

Retained Heap http://supercharles888.blog.51cto.com/609344/1347144 为了开始研究,我们希望在memory 溢出时候能自动生成heap dump文件,为此,我们在运行时候添加JVM 参数: -XX:+HeapDumpOnOutOfMemoryError 然后,我们来做一系列实验来逐步研究各个有趣的问题。 实验1: 我们先来研究最简单的memory leak例子。我们先构造一个POJO类Person,这个Person类就是一般的java 类,然后我们构造一个ArrayList,然后在一个无限循环中一直放这个Person类的实例,因为Person类和ArrayList都在堆上,而ArrayList因为是强引用,所以无法被GC回收, (因为我们List一直在用并没有摧毁) 所以一旦ArrayList所占用的堆内存填满整个heap size时候,heap就溢出了。 POJO类代码是: package com.charles.research; /** 这是一个Person类,我用它来撑满heap @author charles.wang */ public class Person { private String name; private String sex; private int age; public Person( String name,String sex,int age){ this.name=name; this.sex=sex; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; ...

2017-02-07 · 2 min · 386 words · -

pmap

pmap Pmap 命令: 查看进程用了多少内存, Linux Pmap Command - Find How Much Memory Process Use Pmap 提供了进程的内存映射, pmap 命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息。 Pmap 实际上是一个 Sun OS 上的命令,linux 仅支持其有限的功能。但是它还是对查看完整的进程地址空间很有帮助。我们需要 PID 或者运行的进程的唯一进程ID来查看进程内存状态, 我们可以通过/proc 或者常规命令比如 top 或 ps 得到它。 语法或用法 pmap [options] PID 在输出中它显示全部的地址, kbytes, mode 还有 mapping。 选项 -p, -show-path Show full path to files in the mapping column -x extended 显示扩展格式 -d device 显示设备格式 -q quiet 不显示header/footer行 -V 显示版本信息 单一进程内存状态 [root@info ~]# pmap 1013 1013: /usr/sbin/sshd ...

2017-02-06 · 2 min · 382 words · -

NMT, Native Memory Tracking

NMT, Native Memory Tracking NMT for Hotspot VM is turned off by default. Turn this feature on using JVM command line option -XX:NativeMemoryTracking=[off | summary | detail] 注意,根据Java官方文档,开启NMT会有5%-10%的性能损耗; 访问NMT数据 JDK提供了jcmd命令来访问NMT数据: jcmd VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB] 配置项 说明 summary 只打印打印按分类汇总的内存 detail 打印按分类汇总的内存用法、virtual memory map和每次内存分配调用 baseline 创建内存快照,以比较不同时间的内存差异 summary.diff 打印自上次baseline到现在的内存差异,显示汇总信息 detail.diff 打印自上次baseline到现在的内存差异, 显示详细信息 shutdown 关闭NMT功能,NMT can be shutdown using jcmd utility, but can not start/restart using jcmd ...

2017-02-06 · 1 min · 90 words · -

jcmd

jcmd New Features in JDK7 update 4 JRockit command line utility JRCMD (JRockit Command). JRCMD was a command line tool to enumerate the Java processes running on the local machine, and to send commands (referred to as “Diagnostic Commands”) to them. JRCMD has been renamed JCMD (Java Command). jcmd用于向正在运行的JVM发送诊断信息请求,是从JDK1.7开始提供可以说是jstack和jps的结合体 #查看java进程, jcmd 不带参数时默认列出所有java进程。 jcmd [-l] # help jcmd PID help # For more information about a specific command, 查看某一个命令的帮助信息。 jcmd PID help ManagementAgent.start #打印线程栈 jcmd PID Thread.print # 打印线程栈 + 锁信息 jcmd PID Thread.print -l #打印 Thread.print 命令的帮助信息 kill -3 <PID> #仅限Linux平台 jstack <PID> # jcmd提供了输出HPROF格式的堆dump接口。运行jcmd GC.heap_dump 即可。 # 注意这里的FILENAME是相对于运行中的jvm目录来说的,因此避免找不到dump的文件,这里推荐使用绝对路径。此外,也建议使用.hprof作为输出文件的扩展名。 # hprof文件分析工具: NetBeans, Elipse的MAT,jhat jcmd PID GC.heap_dump /tmp/dump.hprof # 打印出堆直方图(同时也打印出存活对象的数目) jcmd <PID> GC.class_histogram #启动参数 jcmd <PID> VM.command_line #查看JVM参数, 如: -XX:MaxHeapSize, -XX:MaxNewSize jcmd <PID> VM.flags #uptime jcmd <PID> VM.uptime # 查看系统变量 jcmd <PID> VM.system_properties jcmd [ pid | main-class ] command [ arguments ] ...

2017-02-06 · 1 min · 213 words · -

mitmproxy

mitmproxy mitmproxy 是用 Python 和 C 开发的一个中间人代理软件 (man-in-the-middle proxy), 它可以用来拦截、修改、重放和保存 HTTP/HTTPS 请求。 它提供了两个命令行工具: mitmproxy 具备交互界面 mitmdump 不具备交互界面, 类似 tcpdump

2017-02-06 · 1 min · 19 words · -

java finalize

java finalize http://blog.csdn.net/walkerjong/article/details/6950091 Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。 有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾 (finalization ) 的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。 要给一个类增加收尾 (finalizer ) ,你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。 finalize()方法的通用格式如下: protected void finalize( ) { // finalization code here } 其中,关键字protected是防止在该类之外定义的代码访问finalize()标识符。该标识符和其他标识符将在第7章中解释。 理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。 注意: 如果你熟悉C ,那你知道C 允许你为一个类定义一个撤消函数 (destructor ) ,它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。 理解finalize()-析构函数的替代者 by Tim Gooch 在许多方面,Java 类似于 C++。Java 的语法非常类似于 C++,Java 有类、方法和数据成员;Java 的类有构造函数; Java 有异常处理。 但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数,Java 支持finalize() 方法。 ...

2017-02-06 · 3 min · 441 words · -

jdk tool, java tool, jvm tool

jdk tool, java tool, jvm tool jcmd Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。 jmc Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。 https://blog.wiloon.com/?p=9724 java Java解释器/运行工具,用于运行.class 字节码文件或.jar文件。 javac Java编译工具(Java Compiler),用于编译Java源代码文件。将Java源代码转换成字节码。 jconsole 图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。 jhat Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆内存中的对象信息。 jmap Java内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。 jstack Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。 wiloon.com/jstack jstat JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。 https://blog.wiloon.com/?p=411 jstatd jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止, 并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。 jvisualvm JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。 appletviewer 小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 (chrome, firefox 不再支持NPAPI) extcheck 扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。 idlj IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。 IDL意即接口定义语言(Interface Definition Language)。 jar jar文件管理工具,主要用于打包压缩、解压jar文件。 jarsigner jar密匙签名工具。 javadoc Java文档工具, 主要用于根据Java 源代码中的注释信息生成HTML格式的API帮助文档。 ...

2017-02-06 · 2 min · 256 words · -

java io PrintStream

java io PrintStream http://www.cnblogs.com/skywang12345/p/io_16.html 本章介绍PrintStream以及 它与DataOutputStream的区别。我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解。 转载请注明出处: http://www.cnblogs.com/skywang12345/p/io_16.html PrintStream 介绍 PrintStream 是打印输出流,它继承于FilterOutputStream。 PrintStream 是用来装饰其它输出流。它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 与其他输出流不同,PrintStream 永远不会抛出 IOException;它产生的IOException会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError() 返回错误标记,从而查看PrintStream内部是否产生了IOException。 另外,PrintStream 提供了自动flush 和 字符集设置功能。所谓自动flush,就是往PrintStream写入的数据会立刻调用flush()函数。 PrintStream 函数列表 /* 构造函数 */ // 将"输出流out"作为PrintStream的输出流,不会自动flush,并且采用默认字符集 // 所谓"自动flush",就是每次执行print(), println(), write()函数,都会调用flush()函数; // 而"不自动flush",则需要我们手动调用flush()接口。 PrintStream(OutputStream out) // 将"输出流out"作为PrintStream的输出流,自动flush,并且采用默认字符集。 PrintStream(OutputStream out, boolean autoFlush) // 将"输出流out"作为PrintStream的输出流,自动flush,采用charsetName字符集。 PrintStream(OutputStream out, boolean autoFlush, String charsetName) // 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。 PrintStream(File file) // 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。 PrintStream(File file, String charsetName) // 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。 PrintStream(String fileName) // 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。 PrintStream(String fileName, String charsetName) ...

2017-02-04 · 4 min · 683 words · -

linux 设置 默认 声卡

linux 设置 默认 声卡 alsa设置默认声卡 2013-11-06 15:43 4650人阅读 评论(0) 收藏 举报 分类: gentoo (47) 版权声明: 本文为博主原创文章,未经博主允许不得转载。 首先说一下alsa的配置文件。alsa的配置文件是alsa.conf位于/usr/share/alsa目录下,通常还有/usr/share/alsa/card和/usr/share/alsa/pcm两个子目录用来设置card相关的参数,别名以及一些PCM默认设置。以上配置文件,我等凡夫从不用修改,修改它们是大神的工作。 还有两个配置文件/etc/asound.conf和~/.asoundrc,它俩有效是因为它俩被alsa.conf引用。以下是alsa.conf的原文: pre-load the configuration files @hooks [ { func load files [ { @func concat strings [ { @func datadir } “/alsa.conf.d/” ] } “/etc/asound.conf” “~/.asoundrc” ] errors false } ] 然后说我遇到的问题。为了提高本人的台式机的性能,在没有换主板的情况下升级了CPU和显卡。CPU没有造成什么影响,显卡是淘来的微星R6750暴雪1G,芯片为AMD Radeon HD 6750。由于它提供了一个HDMI接口,该接口还支持音频输出,于是麻烦出现了,在gentoo下,声音不走板载的HDA VIA VT82xx集成声卡,不知道走到哪里出去了,反正我的耳机没有声音。 找了好多文档,终于然我弄明白怎么回事了。 首先,如果机器有多于一个声卡,可以用下面的命令显示出来: $ cat /proc/asound/cards 0 [Generic ]: HDA-Intel - HD-Audio Generic HD-Audio Generic at 0xfe9bc000 irq 25 1 [VT82xx ]: HDA-Intel - HDA VIA VT82xx HDA VIA VT82xx at 0xfeafc000 irq 17 ...

2017-01-24 · 1 min · 202 words · -

设计模式 – State/状态模式

设计模式 – State/状态模式 State模式的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用? State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State. 是否使用? 在实际使用,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于你的经验和对系统的理解深度. 这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..elseif结构,例如: if (which==1) state=“hello”; else if (which==2) state=“hi”; else if (which==3) state=“bye”; 这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成: if (state.euqals(“bye”)) state=“hello”; else if (state.euqals(“hello”)) state=“hi”; else if (state.euqals(“hi”)) state=“bye”; 这就是 “开关切换状态”,是将state的状态从"hello"切换到"hi",再切换到"“bye”;在切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了. 如果单纯有上面一种将"hello"->“hi”->“bye”->“hello"这一个方向切换,也不一定需要使用State模式,因为State模式会建立很多子类,复杂化,但是如果又发生另外一个行为:将上面的切换方向反过来切换,或者需要任意切换,就需要State了. 请看下例: import java.awt.*; public class OldContext { private Color state = null; public void push() { //如果当前red状态 就切换到blue if (state == Color.red) state = Color.blue; //如果当前blue状态 就切换到green else if (state == Color.blue) state = Color.green; //如果当前black状态 就切换到red else if (state == Color.black) state = Color.red; //如果当前green状态 就切换到black else if (state == Color.green) state = Color.black; Sample sample = new Sample(state); sample.operate(); } public void pull() { //与push状态切换正好相反 if (state == Color.green) state = Color.blue; else if (state == Color.black) state = Color.green; else if (state == Color.blue) state = Color.red; else if (state == Color.red) state = Color.black; Sample sample2 = new Sample(state); sample2.operate(); } } 在上例中,我们有两个动作push推和pull拉,这两个开关动作,改变了Context颜色,至此,我们就需要使用State模式优化它. ...

2017-01-23 · 2 min · 394 words · -

java 运算符 优先级

java 运算符 优先级 http://blog.csdn.net/xiaoli_feng/article/details/4567184 在实际的开发中,可能在一个运算符中出现多个运算符,那么计算时,就按照优先级级别的高低进行计算,级别高的运算符先运算,级别低的运算符后计算,具体运算符的优先级见下表: 优先级 运算符 结合性 1 () [] . 从左到右 2 ! +(正) -(负) ~ ++ – 从右向左 3 * / % 从左向右 4 +(加) -(减) 从左向右 5 << >> »> 从左向右 6 < <= > >= instanceof 从左向右 7 == != 从左向右 8 &(按位与) 从左向右 9 ^ 从左向右 10 | 从左向右 11 && 从左向右 12 | 从左向右 13 ?: 从右向左 14 = += -= *= /= %= &= |= ^= ~= <<= >>= »>= 从右向左 说明: ...

2017-01-17 · 1 min · 111 words · -

traefik

traefik podman run -d \ --name traefik \ -p 80:80 \ -p 8080:8080 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v cert:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ traefik:v2.9.6 dashboard http://192.168.50.51:8080/

2017-01-15 · 1 min · 29 words · -

数据库水平拆分垂直拆分

数据库水平拆分垂直拆分 垂直拆分:专库专用 什么是垂直拆分 一个数据库由很多表组成,每个表对应着不同的业务,垂直拆分是指按照业务将表分类,分布到不同的数据库上面,这样也就将数据或者说压力分担在不同的库上面了 在这里插入图片描述 例子 比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。 在这里插入图片描述 垂直拆分解决了什么问题 垂直拆分可以降低单节点数据库的负载。原来所有数据表都放在一个数据库节点上,无疑所有的读写请求也都发往这个MySQL上面,所以数据库的负载太高。如果一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL的负载 垂直拆分不能解决什么问题 垂直节分不能解决的是缩表,比如说商品表无法划分个哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分得有多细致,每个数据库里面的数据量时没有变化的。 MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直拆分不能起到缩表的效果。 优缺点 优点: 拆分后业务清晰,拆分规则明确 系统之间整合或者扩展容易 数据维护简单 缺点: 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度 受每种业务不同的限制存在单裤性能瓶颈,不易数据扩展跟性能提高。 事务处理复杂 水平拆分:分库分表 什么是水平拆分 相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。 相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。 分库分表需要涉及到对应的SQL路由规则主库备库等,例如:淘宝设计了一套TDDL来解决这些问题,应用端只需配置对应的规则即可,对应用端的没有任何侵入的设计。 在这里插入图片描述 一个误解 很多人对水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢? MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。 如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。 到底是应该先水平还是先垂直???? 先水平然后垂直的理由 感觉各有道理。但我支持先垂直,然后水平 在这里插入图片描述 数据库拆分原则: 优先考虑缓存降低对数据库的读操作 再考虑读写分离,降低数据库写操作 最后开始数据拆分: 先按照业务垂直拆分 在考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中) 最后在考虑分表,单表拆分到数据1000万以内。

2017-01-14 · 1 min · 44 words · -

System.exit(n)

System.exit(n) http://www.cnblogs.com/xwdreamer/archive/2011/01/07/2297045.html 1.参考文献 http://hi.baidu.com/accpzhangbo/blog/item/52aeffc683ee6ec238db4965.html 2.解析 查看java.lang.System的源代码,我们可以找到System.exit(status)这个方法的说明,代码如下: /** Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination. This method calls the exit method in class Runtime. This method never returns normally. The call System.exit(n) is effectively equivalent to the call: Runtime.getRuntime().exit(n) @param status exit status. @throws SecurityException if a security manager exists and its checkExit ...

2017-01-06 · 1 min · 98 words · -