linux 内存

linux 内存 linux 查看内存 top free -h # 内存的更具体的使用情况 cat /proc/meminfo dmidecode -t memory dmidecode |grep -A16 "Memory Device$" 进程内存占用 top ps aux | grep containerd ps -o pid,user,%mem,rss,vsz,comm -C containerd pmap PID #ps ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 其中rsz是是实际内存 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle | sort -nrk5 其中rsz为实际内存,上例实现按内存排序,由大到小 sudo pacman -S htop # Arch Linux htop # 实时查看 containerd 服务的资源占用 systemd-cgtop # 只看 containerd 相关的 systemd-cgtop | grep containerd yay -S smem sudo smem -t -k -c "pid user command rss pss uss" | grep containerd 内存映射 cat /proc/PID/maps cat /proc/PID/smaps free> total 跟物理内存不一致 系统启动时会初始化相关设备,该过程会占用内存,内核启动时,也会占用一部分的内存。 ...

2012-09-25 · 1 min · 98 words · lcf

XML Schema, XML DTD

XML Schema, XML DTD http://www.ibm.com/developerworks/cn/xml/x-sd/index.html 引言 XML DTD(XML的文档类型定义)是近几年来XML技术领域所使用的最广泛的一种模式。但是,由于XML DTD并不能完全满足XML自动化处理的要求,例如不能很好实现应用程序不同模块间的相互协调,缺乏对文档结构、属性、数据类型等约束的足够描述等等,所以W3C于2001年5月正式推荐XML Schema为XML 的标准模式。显然,W3C希望以XML Schema来作为XML模式描述语言的主流,并逐渐代替XML DTD。那么XML Schema与XML DTD相比到底有哪些优势呢,XML DTD是否真的会在XML的模式描述领域中逐渐消失呢? 回页首 XML模式与XML格式 XML模式是指用来描述XML结构、约束等因素的语言,例如XML Schema、XML DTD、XDR,SOX等等。XML格式则是XML文档本身所具有的格式。本文以XML Schema来代表W3C所推荐的XML Schema模式标准,而以"XML模式"来代表所有的XML模式描述语言。 从模式的描述语言来说,XML Schema和XML DTD都属于语法模式。与概念模式不同,语法模式在对同一事物描述时,可以采用不同的语法,例如在对关系模式描述时,无论是使用XML Schema还是XML DTD,都既可以用元素也可以用属性来描述关系模式的列。 模式必须以某种格式来表示,XML Schema的格式与XML DTD的格式有着非常明显的区别,XML Schema事实上也是XML的一种应用,也就是说XML Schema的格式与XML的格式是完全相同的,而作为SGML DTD的一个子集,XML DTD具有着与XML格式完全不同的格式。这种区别会给XML Schema的使用带来许多好处: XML用户在使用XML Schema的时候,不需要为了理解XML Schema而重新学习,节省了时间; 由于XML Schema本身也是一种XML,所以许多的XML编辑工具、API 开发包、XML语法分析器可以直接的应用到XML Schema,而不需要修改。 作为XML的一个应用,XML Schema理所当然的继承了XML的自描述性和可扩展性,这使得XML Schema 更具有可读性和灵活性。 由于格式完全与XML一样,XML Schema除了可以像XML一样处理外,也可以同它所描述的XML文档以同样的方式存储在一起,方便管理。 XML Schema与XML格式的一致性,使得以XML为数据交换的应用系统之间,也可以方便的进行模式交换。 XML有非常高的合法性要求,XML DTD对XML的描述,往往也被用作验证XML合法性的一个基础,但是XML DTD本身的合法性却缺少较好的验证机制,必需独立处理。XML Schema则不同,它与XML有着同样的合法性验证机制。

2012-09-25 · 1 min · 55 words · lcf

linux下用adb为android手机批量安装软件

linux下用adb为android手机批量安装软件 通常大家安装软件都是从Andorid Market或者从网上下载到手机本地安装,这有两个问题,第一个情况碰到网速慢,那要急死,第二种情况是安装的太慢,如果软件多的话,手指累死,那么,就用adb安装吧,看我的操作情况: 首先把以前安装的软件备份到电脑,比如~/backup/,接着,打开电脑上的终端,取得root权限, cd adb ./adb start-server 打开另一个终端,默认用户权限 $ cd adb $ sh install.sh (-sh里面的内容如这样: ./adb install ~/backup/***.apk……,把你要装的软件都这样编辑,一行一个软件) ok,等着吧,安装完,切换到第一个终端,执行 ./adb kill-server 安全移除手机,看看手机上是不是已经显示你安装的软件了,呵呵

2012-09-24 · 1 min · 23 words · -

Java GenNode结构

Java GenNode结构 GenNode.java package com.http; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; /** * The Class Node. */ public class GenNode implements Serializable { /** * The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; public static final String ATTRIBUTE = "attribute"; /** * The name. */ private String name; /** * The parent. */ private GenNode parent; /** * The value. */ private String value; /** * The attribute map. */ private Map<String, String> attributes; /** * The elements. */ private Map<String, List<GenNode>> elements = new HashMap<String, List<GenNode>>(); /** * Instantiates a new node. * * @param parent the parent * @param name the name */ public GenNode(GenNode parent, String name) { this.parent = parent; this.name = name; } /** * Instantiates a new node. * * @param parent the parent * @param name the name * @param value the value */ public GenNode(GenNode parent, String name, String value) { this.name = name; this.parent = parent; this.value = value; } /** * Instantiates a new node. * * @param parent the parent * @param name the name * @param value the value */ public GenNode(GenNode parent, String name, String value, NamedNodeMap atts) { this.name = name; this.parent = parent; this.value = value; this.setAttributes(atts); } /** * Adds the child. * * @param name the name * @param value the value * @return the node */ public GenNode addChild(String name, String value) { GenNode child = new GenNode(this, name, value); List<GenNode> list = null; if (!elements.containsKey(name)) { list = new ArrayList<GenNode>(); elements.put(name, list); } else { list = elements.get(name); } list.add(child); return child; } public GenNode addChild(GenNode node) { String name = node.getName(); List<GenNode> list = null; if (!elements.containsKey(name)) { list = new ArrayList<GenNode>(); elements.put(name, list); } else { list = elements.get(name); } list.add(node); return node; } /** * Gets the name. * * @return the name */ public String getName() { return name; } /** * Sets the name. * * @param name the new name */ public void setName(String name) { this.name = name; } /** * Gets the parent. * * @return the parent */ public GenNode getParent() { return parent; } /** * Sets the parent. * * @param parent the new parent */ public void setParent(GenNode parent) { this.parent = parent; } /** * Gets the value. * * @return the value */ public String getValue() { return value; } /** * Sets the value. * * @param value the new value */ public void setValue(String value) { this.value = value; } /** * Gets the attributes of this GenNode. * * @return the Map */ public Map<String, String> getAttributes() { return this.attributes; } /** * Sets the attributes. * * @param atts */ public void setAttributes(NamedNodeMap atts) { if (attributes == null) { attributes = new HashMap<String, String>(); } attributes.clear(); for (int i = 0; i < atts.getLength(); i++) { Node attrNode = atts.item(i); this.attributes .put(attrNode.getNodeName(), attrNode.getNodeValue()); } } /** * Gets the attributes of this GenNode. * * @return the Map */ public List<GenNode> getAttributeNodes() { return getChildren(ATTRIBUTE); } /** * Gets the attribute key set. * * @return the attribute key set */ public Set<String> getAttributesKeySet() { Set<String> set = new HashSet<String>(); List<GenNode> list = getAttributeNodes(); if (list != null && !list.isEmpty()) { for (GenNode node : list) { set.add(node.getName()); } } return set; } /** * Gets the attribute. * * @param name the name * @return the attribute */ public GenNode getAttribute(String name) { return getChild(ATTRIBUTE + "_" + name); } /** * Gets the attribute value. * * @param name the name * @return the attribute value */ public String getAttributeValue(String name) { GenNode node = getChild(ATTRIBUTE + "_" + name); return node != null ? node.getValue() : null; } /** * Size. * * @return the int */ public int size() { return elements.size(); } /** * Gets the elements. * * @param name the name * @return the elements */ protected List<GenNode> getElements(String name) { return elements.get(name); } /** * Gets the children. * * @param name the name * @return the children */ public List<GenNode> getChildren(String name) { List<NodePath> list = NodeUtil.getNodePaths(name); List<GenNode> children = null; int len = list.size(); if (len > 0) { int index = 0; GenNode tmpNode = this; for (NodePath path : list) { index++; children = tmpNode.getElements(path.getKey()); if (children == null) { return null; } if (children.isEmpty()) { tmpNode = null; break; } else if (index < len) { if (path.getIndex() < children.size()) { tmpNode = children.get(path.getIndex()); } else { tmpNode = null; } } if (tmpNode == null) { children = null; break; } } } return children; } /** * Gets the child. * * @param name the name * @return the child */ public GenNode getChild(String name) { List<NodePath> list = NodeUtil.getNodePaths(name); GenNode tmpNode = null; int len = list.size(); if (len > 0) { int index = list.get(len - 1).getIndex(); tmpNode = getChild(name, index); } return tmpNode; } /** * Gets the child value. * * @param name the name * @return the child value */ public String getChildValue(String name) { String value = null; GenNode node = getChild(name); if (node != null) { value = node.getValue(); } return value; } /** * Gets the child. * * @param name the name * @param index the index * @return the child */ public GenNode getChild(String name, int index) { GenNode rtnNode = null; List<GenNode> children = getChildren(name); if (children != null && !children.isEmpty() && children.size() > index) { rtnNode = children.get(index); } return rtnNode; } /** * Gets the child value. * * @param name the name * @param index the index * @return the child value */ public String getChildValue(String name, int index) { String value = null; GenNode node = getChild(name, index); if (node != null) { value = node.getValue(); } return value; } /** * Gets the full name. * * @return the full name */ public String getFullName() { String fullName = this.name; int index = 0; if (parent != null) { fullName = NodeUtil.makePath(parent.getFullName(), fullName); List<GenNode> list = parent.getElements(this.name); index = list.indexOf(this); } fullName = NodeUtil.makePath(fullName, index); return fullName; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("FullName = " + getFullName()); sb.append("; Name = " + getName()); sb.append("; Value = " + getValue()); return sb.toString(); } public Map getElements() { return elements; } } NodePath.java ...

2012-09-24 · 9 min · 1894 words · lcf

linux 时区,时间

linux 时区,时间 # 把硬件时间设置成系统时间 hwclock --hctosys # 把系统时间设置成硬件 hwclock --systohc # 设置硬件时间 hwclock --set --date="mm/dd/yy hh:mm:ss" # 修改系统时间 date -s "dd/mm/yyyy hh:mm:ss" timedatectl 设置时区 # 查看系统时间方面的各种状态 timedatectl timedatectl status # 列出所有时区 timedatectl list-timezones # 设置系统时区为上海 timedatectl set-timezone Asia/Shanghai timesync sudo systemctl restart systemd-timesyncd systemctl status systemd-timesyncd timedatectl show-timesync timedatectl timesync-status https://www.linuxuprising.com/2019/07/how-to-set-timezone-and-enable-network.html timedatectl set-local-rtc 1 # 将硬件时钟调整为与本地时钟一致, 0 为设置为 UTC 时间 其实不考虑各个发行版的差异化, 从更底层出发的话, 修改时间时区比想象中要简单: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ...

2012-09-24 · 2 min · 397 words · lcf

UML

UML 时序图, Sequence Diagram Use Case Diagram 类图, Class Diagram Object Diagram 活动图, Activity Diagram 组件图, Component Diagram 部署图, Deployment Diagram 状态图, State Diagram Timing Diagram 部署图 部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。一个系统模型只有一个部署图,部署图通常用来帮助理解分布式系统。 组件图 https://zhuanlan.zhihu.com/p/78244670 https://plantuml.com/zh/component-diagram 组件图:组件图是 UML(统一建模语言)中的一种结构图,用于可视化系统组件的组织和关系。这些图有助于将复杂的系统分解成易于管理的组件,展示它们之间的相互依存关系,确保高效的系统设计和架构。 Component diagram shows components, provided and required interfaces, ports, and relationships between them. This type of diagrams is used in Component-Based Development (CBD) to describe systems with Service-Oriented Architecture (SOA). Component-based development is based on assumptions that previously constructed components could be reused and that components could be replaced by some other “equivalent” or “conformant” components, if needed. The artifacts that implement component are intended to be capable of being deployed and re-deployed independently, for instance to update an existing system. ...

2012-09-24 · 2 min · 261 words · -

ultra mobile

ultra mobile 换手机之后给手机写入 eSIM ultra mobile 用手机号和密码登录 切换到 ACCOUNT My SIM> Change Device Get an eSIM This is my new device 选择 我有 wifi 连接 然后需要等一段时间会自动切换掉安装 eSIM 页面

2012-09-22 · 1 min · 28 words · -

postgresql json jsonb

jpostgresql json jsonb postgresql—-JSON类型和函数 postgresql支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快。 注意:键值对的键必须使用双引号 从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar、int一样,我们表里的一个字段的类型可以为json了。 与此同时,postgres还提供了jsonb格式,jsonb格式是json的二进制形式,二者的区别在于json写入快,读取慢,jsonb写入慢,读取快,但在操作上,二者是没有区别的。下面以jsonb为例。 创建表 假设我们要存储的json数据是这样的: { “id”: ID “name”:“名字”, “age”:年龄 } 建表语句如下: create table if not exists name_age ( info jsonb ) 好了,这样就创建了一张表,里面只有一个 info 字段,下面开始进行CRUD操作。 插入数据 插入数据可以直接以json格式插入: insert into name_age values(’{“id”:1,“name”:“小明”, “age”:18}’) 在json里插入新的key值gender,如下: SELECT info||’{“gender”:“男”}’::jsonb from name_age where (info-»‘id’)::int4 = 1 查询数据 Postgres里的查询需要用到查询符。比如说,我们要查询id为1的数据,语句如下: select info from name_age where info @> ‘{“id”:1}’::jsonb 用到了 @> 这个查询符,表明info当前这条记录里的顶层json中有没有id为1的key-value对;有的话则满足条件。 再来一个复杂一点的查询的,查询 age>16 的记录,并且只显示 name ,语句如下: select info->‘name’ from name_age where (info-»‘age’)::int4 > 16 关于详细运算符使用,请参考官方文档: 9.15. JSON Functions and Operators ...

2012-09-22 · 4 min · 716 words · -

Revolution OS操作系统革命

Revolution OS操作系统革命 操作系统革命的剧情简介 · · · · · · 内容简介(来自http://blog.9zi.com/post/1/979) : 在微软垄断下有一件东西永远它永远不会给你――真正的自由。也正是因为这个原因,不少先锋人物站出来反抗微软帝国,并努力建立一种新的操作系统――没有人为的限制,任何人都可以自由地使用。 为了记录这些人的艰苦历程,J.T.S. Moore拍摄了全新的记录片――REVOLUTON OS,向公众介绍这些建立Linux操作系统,奋起反抗垄断的斗士的人生经历。 现在微软已经明显感到了来自Linux的压力。微软的首席执行官去年6月公开表示: “Linux 是一种癌症!"。但这丝毫不能影响Linux发展的步伐。 REVOLUTION OS中记录了Linux的创建人Linus Torvalds以及Richard Stallman, Bruce Perens, Eric Raymond, Brian Behlendorf, Michael Tiemann, Larry Augustin, Frank Hecker, Rob Malda等人的生活经历或者采访记录。 http://movie.douban.com/subject/1437389/

2012-09-22 · 1 min · 37 words · -

java hashcode

java hashcode java hash code hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂 (事实上这个编码是可以由程序员通过继承和接口的实现重写的) ,可以参考数据结构书籍。而hashtable等结构,就是通过这个哈希实现快速查找键对象。这是他们的内部联系,但一般编程时无需了解这些,只要知道hashtable实现了一种无顺序的元素排列就可以了。 两个对象值相同(x.equals(y) == true),则一定有相同的hash code。 因为: Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入 (又叫做预映射, pre-image) ,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 以下是java语言的定义: 对象相等则hashCode一定相等; hashCode相等对象未必相等。 这也涉及到如何写自定义的hashCode方法的问题: 必须符合以上条件。注意条件2中的未必。具体可参见java doc; Effective Java中有更详细论述。 补充一点个人简介 hash 就是 类似于数学集合, 每一个键,k可以对应一个或多个值,对象就类似于值,所以"相同的对象"具有相同的键值,也就是hashCode;

2012-09-21 · 1 min · 31 words · -

java Constructor

java Constructor **一、构造器是干什么用的? (what) ** 构造器是用来生成一个类的实例是用来初始化这个实例用的 **二、构造器如何工作? (how) ** Java在构造实例时的顺序是这样的: 分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。 执行属性值的显式初始化 执行构造器 4 、将变量关联到堆中的对象上 而执行构造器的步骤有可以分为以下几步: Bind构造器的参数 如果显式的调用了this,那就递归调用this构造器然后跳到步骤5 递归调用显式或者隐式的父类构造器,除了Object以外,因为它没有父类 执行显式的实例变量初始化 (也就是上边的流程中的第二步,调用返回以后执行, 这个步骤相当于在父构造器执行后隐含执行的,看样子像一个特殊处理) 三、构造器不可被orerride (why) 其实你只需要记住一句话: 构造器不是方法,那么用来修饰方法特性的所有修饰符都不能用来修饰构造器 (并不等与构造器 具备这些特性,虽然不能用static修饰构造器,但它却有静态特性) 构造器只能用 public private protected这 三个权限修饰符,且不能有返回语句。 参考: http://doc.linuxpk.com/43476.html

2012-09-21 · 1 min · 35 words · -

java native

java native Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层 (如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件 (注意其中又包含了JDK带的jni.h文件) ; 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 JAVA本地方法适用的情况 1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问 2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的 3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。 首先写好JAVA文件 /* Created on 2005-12-19 Author shaoqi */ package com.hode.hodeframework.modelupdate; public class CheckFile { public native void displayHelloWorld(); static { System.loadLibrary(“test”); } public static void main(String[] args) { new CheckFile().displayHelloWorld(); } } 然后根据写好的文件编译成CLASS文件 然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile, 就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件 然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件 #include “CheckFile.h” #include #include JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj) { printf(“Hello world!n”); return; } 之后编译生成DLL文件如"test.dll",名称与System.loadLibrary(“test”)中的名称一致 vc的编译方法: cl -I%java_home%include -I%java_home%includewin32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll ...

2012-09-21 · 1 min · 80 words · -

Java assertion

Java assertion ashttp://www.ibm.com/developerworks/cn/java/l-javaassertion/index.html sertion的语法和语义 J2SE 1.4在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在Java语言方面最大的革新。在软件开发中,assertion是一种经典的调试、测试方式,本文将深入解析assertion功能的使用以及其设计理念,并给出相关的例子 。 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身、有的是通过库函数等。另外,从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。 在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。下面简单介绍一下Java中assertion的实现。 1.1) 语法表示 在语法上,为了支持assertion,Java增加了一个关键字assert。它包括两种表达式,分别如下: assert expression1; assert expression1: expression2; 在两种表达式中,expression1表示一个boolean表达式,expression2表示一个基本类型或者是一个对象(Object) ,基本类型包括boolean,char,double,float,int和long。由于所有类都为Object的子类,因此这个参数可以用于所有对象。 1.2) 语义含义 在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象;如果expression1值为true,expression2将不被计算。 一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。 1.3) 一些assertion例子 下面是一些Assert的例子。 assert0 < value; assert0 < value:“value="+value; assertref != null:“ref doesn’t equal null”; assertisBalanced(); 1.4) 编译 由于assert是一个新关键字,使用老版本的JDK是无法编译带有assert的源程序。因此,我们必须使用JDK1.4(或者更新)的Java编译器,在使用Javac命令时,我们必须加上-source 1.4作为参数。-source 1.4表示使用JDK 1.4版本的方式来编译源代码,否则编译就不能通过,因为缺省的Javac编译器使用JDK1.3的语法规则。 一个简单的例子如下: javac -source 1.4 test.java 1.5) 运行 由于带有assert语句的程序运行时,使用了新的ClassLoader和Class类,因此,这种程序必须在JDK1.4(或者更高版本)的JRE下运行,而不能在老版本的JRE下运行。 由于我们可以选择开启assertion功能,或者不开启,另外我们还可以开启一部分类或包的assertion功能,所以运行选项变得有些复杂。通过这些选项,我们可以过滤所有我们不关心的类,只选择我们关心的类或包来观察。下面介绍两类参数: 参数 -esa和 -dsa: 它们含义为开启(关闭)系统类的assertion功能。由于新版本的Java的系统类中,也使了assertion语句,因此如果用户需要观察它们的运行情况,就需要打开系统类的assertion功能 ,我们可使用-esa参数打开,使用 -dsa参数关闭。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。 参数 -ea和 -ea: 它们含义为开启(关闭)用户类的assertion功能: 通过这个参数,用户可以打开某些类或包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,表示打开这些类或包;如果包名称后面跟有三个点,代表这个包及其子包;如果只有三个点,代表无名包。关闭assertion功能参数为-da,使用方法与-ea类似。 -ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。 下面表格表示了参数及其含义,并有例子说明如何使用。 参数 例子 说明 -ea java -ea 打开所有用户类的assertion -da java -da 关闭所有用户类的assertion -ea:<classname> java -ea:MyClass1 打开MyClass1的assertion -da:<classname> java -da: MyClass1 关闭MyClass1的assertion -ea:<packagename> java -ea:pkg1 打开pkg1包的assertion -da:<packagename> java -da:pkg1 关闭pkg1包的assertion -ea:... java -ea:... 打开缺省包(无名包)的assertion -da:... java -da:... 关闭缺省包(无名包)的assertion -ea:<packagename>... java -ea:pkg1... 打开pkg1包和其子包的assertion -da:<packagename>... java -da:pkg1... 关闭pkg1包和其子包的assertion -esa java -esa 打开系统类的assertion -dsa java -dsa 关闭系统类的assertion 综合使用 java -dsa:MyClass1:pkg1 关闭MyClass1和pkg1包的assertion 其中...代表,此包和其子包的含义。例如我们有两个包为pkg1和pkg1.subpkg。那么pkg1...就代表pkg1和pkg1.subpkg两个包。 另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API。下面简单说明一下几个API的作用。 ClassLoader类中的几个相关的API: setDefaultAssertionStatus:用于开启/关闭assertion功能 setPackageAssertionStatus:用于开启/关闭某些包的assertion功能 setClassAssertionStatus: 用于开启/关闭某些类的assertion功能 clearAssertionStatus: 用于关闭assertion功能 [回页首][1] assertion的设计问题 首先,我们认为assertion是必要的。因为,如果没有统一的assertion机制,Java程序通常使用if-then-else或者switch-case语句进行assertion检查,而且检查的数据类型也不完全相同。assertion机制让Java程序员用统一的方式处理assertion问题,而不是按自己的方式处理。另外,如果用户使用自己的方式进行检查,那么这些代码在发布以后仍然将起作用,这可能会影响程序的性能。而从语言言层次支持assertion功能,这将把assertion对性能带来的负面影响降到最小。 Java是通过增强一个关键字assert实现支持assertion,而不是使用一个库函数支持,这说明Java认为assertion对于语言本身来说是非常重要的。实际上,在Java的早期的规范中,Java是能够支持assert的,但是由于一些实现的限制,这些特性从规范中除去了。因此,assert的再次引入应该是恢复了Java对assert的支持。C语言就是通过Assert.h函数库实现断言的支持。 Java的assertion的开启也和C语言不太一样,我们都知道在C语言中,assertion的开启是在编译时候决定的。当我们使用debug方式编译程序时候,assertion被开启,而使用release方式编译时候,assertion自动被关闭。而Java的assertion却是在运行的时候进行决定的。其实,这两种方式是各有优缺点。如果采用编译时决定方式,开发人员将处理两种类型的目标码,debug版本和release版本,这加大了文档管理的难度,但是提高了代码的运行效率。Java采用运行时决定的方式,这样所有的assertion信息将置于目标代码中,同一目标代码可以选择不同方式运行,增强目标代码的灵活性,但是它将牺牲因为assertion而引起一部分性能损失。Java专家小组认为,所牺牲的性能相当小,因此java采用了运行时决定方式。 另外,我们注意到AssertionError作为Error的一个子类,而不是RuntimeException。关于这一点,专家组也进行了长期的讨论。Error代表一些异常的错误,通常是不可以恢复的,而RuntimeException强调该错误在运行时才发生的特点。AssertionError通常为非常关键的错误,这些错误往往是不容易恢复的,而且assertion机制也不鼓励程序员对这种错误进行恢复。因此,为了强调assertion的含义,Java专家小组选择了让AssertError为Error的子类。 [回页首][1] assertion与继承 在本节,我们将考虑assertion与继承的关系,研究assert是如何定位的。如果开启一个子类的assertion,那么它的父类的assertion是否执行? 下面的例子将显示如果一个assert语句在父类,而当它的子类调用它时,该assert为false。我们看看在不同的情况下,该assertion是否被处理。 class Base { public void baseMethod() { assert false : “Assertion failed:This is base “;// 总是assertion失败 System.out.println(“Base Method”); } } class Derived extends Base { public void derivedMethod() { assert false: “Assertion failed:This is derive”;// 总是assertion失败 System.out.println( “Derived Method” ); } public static void main( String[] args ) { try { Derived derived = new Derived(); derived.baseMethod( ); derived.derivedMethod(); } catch( AssertionError ae ) { System.out.println(ae); } } } ...

2012-09-21 · 2 min · 368 words · -

在WSL2中安装ArchLinux

在WSL2中安装ArchLinux https://zhuanlan.zhihu.com/p/266585727 https://github.com/DDoSolitary/LxRunOffline .\LxRunOffline i -n archlinux -f C:\workspace\apps\archlinux-bootstrap-2022.02.01-x86_64.tar.gz -d C:\workspace\apps\wsl-archlinux -r root.x86_64 wsl --set-version archlinux 2 wsl -d archlinux lxrunoffline su -n archlinux -v 1000

2012-09-21 · 1 min · 26 words · -

Static Nested Class, Inner Class, Anonymous Inner Class

Static Nested Class, Inner Class, Anonymous Inner Class Inner Class (内部类) 定义在类中的类 Nested Class (嵌套类) 是静态 (static) 内部类。 要创建嵌套类的对象,并不需要其外围类的对象。 不能从嵌套类的对象中访问非静态的外围类对象。 Anonymous Inner Class (匿名内部类) 匿名的内部类是没有名字的内部类。 匿名的内部类不能extends (继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 嵌套类可以作为接口的内部类。正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。 内部类被继承,由于内部类有一个指向外围类对象的秘密引用,所以在继承内部类的时候,该秘密引用必须被初始化。解决方法是enclosingClassReference.super();语法,看一下代码: class Outer { class Inner { } } class AnoClass extends Outer.Inner { AnoClass (Outer wi) { wi.super(); } } 匿名类 (Anonymous Class) 当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。 f.addMouseMotionListener(new MouseMotionAdapter(){ //匿名类开始 public void mouseDragged(MouseEvent e){ String s="Mouse dragging: x="+e.getX()+"Y="+e.getY(); tf.setText(s); } } ); //匿名类结束 存在它的原因是: ...

2012-09-21 · 1 min · 89 words · -

forward redirect

forward redirect forward vs redirect forward 是服务器内部重定向,程序收到请求后重新定向到另一个程序,而客户机并不知晓; forward会将 request state、bean、等信息带到下一个jsp页面; 使用getAttribute () 来取得前一个jsp所放的信息 redirect 是服务器收到请求后发送一个状态头给客户,客户将再次请求,就有两次网络通行的来往。 redirect 是送到客户端后再次request,因此上一个jsp的信息不被保留 效率: Forward高, Redirect低, 因为Redirect的流程是这样的, request 1 sent to server, server return back to client, request 2 then sent to server. But Forward 仅在server side处理, 对client side 是透明的. 由于Redirect 有两次传输, 所以效率低. 范围: 由于对request.setAttribute() 来说, 它携带的对象生存范围只在request内, 所以Redirect方式会导致request携带的对象丢失. http://www.iteye.com/topic/3497 http://article2008.iteye.com/blog/173832

2012-09-21 · 1 min · 54 words · -

Java, 堆(Heap), 栈/线程栈(Stack), 方法区(method), 常量池

Java, 堆(Heap), 栈/线程栈(Stack), 方法区(method), 常量池 Java, 堆(Heap), 栈/线程栈(Stack), 方法区(method Area), 常量池(Constant Pool) heap, 堆 堆是线程共享的,所有的对象的实例和数组都存放在堆中,任何线程都可以访问。Java的垃圾自动回收机制就是运用这个区域的。 Stack(栈), thread stacks(线程栈), call stack, Execution stack 栈是线程私有的,每个线程都是自己的栈,每个线程中的每个方法在执行的同时会创建一个栈帧用于保存 PC(程序计数器) 局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。其中局部变量表,存放基本类型 (boolean、byte、char、short、int、float) 、对象的引用等等,对象的引用不是对象实例本身,而是指向对象实例的一个指针。 ———————————————— 版权声明: 本文为CSDN博主「万猫学社」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/heihaozi/article/details/102752636 内存指令区,存储数据: 基本数据类型, 指令代码,常量,对象的引用地址(2) Hotspot VM: 栈内存从概念上分 “线程的栈内存” 和 “JVM的栈内存” 两种。 线程的栈内存: 每新建一个线程时,会分配给这个线程一个栈内存初始值,最大的大小可通过 -Xss 来设置。线程占有的栈内存大小,通过不断执行方法,生成局部变量等操作,栈桢不断增加,该线程的栈内存也不断被使用。最终达到 -Xss 的值时,会抛出 StackOverFlowError。其实这里就是线程的栈内存溢出,背后的概念与 OOME 是一样的,只是jvm设计者取的名字不一样而已。3.JVM的栈内存: 当一个jvm进程启动时,会不断消耗 native memory。我们可以通过参数 -Xmx 等来设置堆内存、方法区内存的最大值,当达到阀值时,jvm就会报OOME。但是栈内存大小,则是物理机器的 native memory,其上限就是native memory的上限。不断建线程消耗native memory待尽时,就会报OOME。 作者: chiukong 链接: https://www.zhihu.com/question/28637033/answer/41677862 来源: 知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法 (方法是指令,保存在stack中) 。对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。 基本数据类型包括byte、int、char、long、float、double、boolean和short。 函数方法属于指令 引用网上广泛流传的"Java堆和栈的区别"里面对堆和栈的介绍; ...

2012-09-21 · 3 min · 538 words · -

HashMap,Hashtable

HashMap,Hashtable HashMap, Hashtable HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像 Vector 和ArrayList一样。 HashTable不允许null值(key和value都不可以), HashMap允许 null 值(key和value都可以)。 hashMap去掉了HashTable 的contains(Object value)方法,但是加上了containsValue ()和containsKey ()方法。 HashTable使用 Enumeration,HashMap使用 Iterator。以上只是表面的不同,它们的实现也有很大的不同。 HashTable中 hash数组默认大小是11,增加的方式是 old*2+1。HashMap 中 hash数组的默认大小是16,而且一定是2的指数。 哈希值的使用不同,HashTable 直接使用对象的hashCode,代码是这样的: int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; //而HashMap重新计算hash值,而且用与代替求模: int hash = hash(k); int i = indexFor(hash, table.length); static int hash(Object x) { int h = x.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } static int indexFor(int h, int length) { return h & (length-1); } ``` 以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如 HashMap对null的操作 HashMap可以看作三个视图: key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。 往hashset中插入对象其实只不过是内部做了 public boolean add(Object o) { return map.put(o, PRESENT)==null; } HashMap为散列映射,它是基于hash table的一个实现,它可在常量时间内安插元素,或找出一组key-value pair.HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode() http://oznyang.iteye.com/blog/30690 http://zhaosoft.iteye.com/blog/243587 http://coolshell.cn/articles/9606.html http://coolshell.cn/articles/9606.html/embed#?secret=NbrQHz1OQo

2012-09-21 · 1 min · 115 words · -

java 位运算,移位运算符,bitwise operators

‘java 位运算,移位运算符,bitwise operators’ Java提供的位运算符有: 左移( « )、右移( » ) 、无符号右移( »> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。 左移( « ) Test1、将5左移2位: package com.xcy; public class Test { public static void main(String[] args) { System.out.println(5<<2);//运行结果是20 } } 运行结果是20,但是程序是怎样执行的呢? 首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位): 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0: 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 右移( » ) ,右移同理,只是方向不一样罢了(感觉和没说一样) System.out.println(5»2);//运行结果是1 ...

2012-09-21 · 2 min · 405 words · -

同步/异步

同步/异步 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。 并不是说谁好谁不好,只是同步的机制不适合在正式应用的项目当中 (但自己测试还是可以的) 同步,就是实时处理,比如服务器一接收客户端请求,马上响应,这样客户端可以在最短的时间内得到结果,但是如果多个客户端,或者一个客户端发出的请求很频繁,服务器无法同步处理,就会造成涌塞。 异步,就是分时处理,服务器接收到客户端请求后并不是立即处理,而是等待服务器比较空闲的时候加以处理,可以避免涌塞。 同步和异步之分: 同步就是调用一个函数,直接函数执行完了才返回到调用函数 异步就是被调用函数初始化完后马上返回。 多线程应用服务器工作 同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。异步在一定程度上可以看做是多线程的(废话,一个线程怎么叫异步),请求一个方法后,就不管了,继续执行其他的方法。比如一个文章系统里面,文章内容通常是字数非常多的,如果数据量大,打开会非常的慢,这个时候可以采取两种方法: 1、死心眼: 一直等待要显示的数据全部取出来 标题、作者、来源、创建时间、关键字、点击次数、文章正文 ok,全部取出 显示 碰上心急的用户,他会骂死你的。 2、异步: 首先显示能够快速取出的部分: 标题、作者、来源、创建时间、关键字、点击数 显示 然后另外的一个线程等待取出文章的正文显示! 异步就是: 做一件事情的同事,不影响做其他的事情。 -------------- 同步就是(我死心眼)我等你(给我回答),异步就是(我很忙)我不等你(给我回答) 严格的说,异步还是有两种 一种是等,但是等的过程和同步不一样,等的时候可以做别的工作,但是程序的主线还是等待 WaitforSingleObject(hEvent,INFINTE,TRUE); 另外一种是CALLBACK方式,这种异步是完全不等待,程序主线发出请求之后就干别的事情去了,完全不理会请求执行的如何。 所有异步必然设计两个以上的线程 (不然不存在异步的问题) ,第一种方式下,请求的后期工作是在发出请求的线程上执行,第二种方式下,后期工作可以在任何线程 (通常是执行请求的线程上) 完成。

2012-09-20 · 1 min · 36 words · -