2016年6月20日

财务制度题库

     摘要: 1财务制度题库 单选题 1.下列各会计要素,(   )不是反映财务状况的会计要素。 A.资产          B.负债          C.收入    ...  阅读全文

posted @ 2021-10-22 23:09 youngturk| 编辑 收藏

jquery 向mybitis后台传完整时间

var ssshsj = new Date( $("#ssshsj").val().replace(/-/g,"/")); 对于Ibatis操作Date/Time/DateTime,总结如下: 将pojo的属性类型设置为java.sql.Date(或java.sql.Time, java.sql.Timestamp),此时会严格遵循这三种类型的语义。但此方法因存在前文中提到的性能问题,在JDK1.6以前的JDK版本中能少使用就少使用。 如果你想在pojo中使用java.util.Date, 则要注意: 完整的日期时间,要确保jdbcType为空,或为DATE,TIME以外的值 只需要时间,要指定jdbcType=”TIME” 只需要日期,要指定jdbcType=”DATE”

posted @ 2017-03-26 00:22 youngturk| 编辑 收藏

webwork 实现数据生成text文件,并进行压缩,并进行下载

//实现压缩文件功能,采用commons-io-2.0.1.jar ,commons-compress-1.5.jar插件
        final OutputStream out = new FileOutputStream("D:/EDI/EDi.zip");  //实例文件输出流
        ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);  
        //实例化存档输出流,工厂方法创建zip的存档输出流
//        File f1 = new File(file.getPath());
        os.putArchiveEntry(new ZipArchiveEntry(file.getName()));  //生成存档文件名
        IOUtils.copy(new FileInputStream(file), os);  //添加拷贝存档文件
        
        os.closeArchiveEntry();  
        os.close();  
        
        //*************************
        try {
            File input = new File("D:/EDI/EDi.zip");//获得下载文件路径
            contentType="application/octet-stream";
            docStream = new FileInputStream(input);//获得输入流名称
            contentDisposition =URLEncoder.encode(input.getName() ,"UTF-8");
           } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }  
           return "download";
WEBWORK的文件下载机制。使用起来还是比较简单的。
下面是用法说明:
首先在一个ACTION中,如果判断有权限进行文件下载。
则:
1、读出该下载文件,并生成一个流。 文件名应当从请求的request中读出,或从用户的表中取出。
public String downLoadFile(String fileName){
   try {
    File input = new File("e:/engilish literature.doc");
    docStream = new FileInputStream(input);
    contentDisposition = "test.txt";
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }  
   return "download";
}
2、将输出导向到一个特殊的RESULT中去。叫做Steam Result。
         <action name="register" class="com.job2easy.web.user.RegisterAction">
             <result name="success" type="dispatcher">
                 <param name="location">/home/register-result.jsp</param>
             </result>
             <result name="input">
                 <param name="location">/home/register.jsp</param>
             </result>
             <result name="download" type="stream">
                 <param name="contentType">application/x-msdownload</param>
                 <param name="inputName">docStream</param>
                 <param name="bufferSize">1024</param>              
                 <param name="contentDisposition">attachment;filename="${contentDisposition}"</param>
             </result>

             <interceptor-ref name="params"/>
         </action>
3、这中间有几个参数需要配置:
     contentType设成 application/x-msdownload 就可以。这样浏览器会保证弹出一个下载文件的对话框。
    inputName 这个比较重要,这个名字是输入流的名称, 以后要steam result的实现类中为根据OGNL的表达式去查找的。
    contentDisposition 这个是下载之后,保存在用户端的文件名称。${contentDisposition} 看一下代码。如果写成上述的方式,就有机会在ACTION中设置文件名。
4、另外一个参数:contentLength就是下载文件的大小,webwork的stream result似乎实现有问题,不能根据文件的大小动态进行设置,只能写死。
     这个参数的意义是告诉浏览下载的文件有多大,以便浏览器正确的显示进度条。如果这个功能很重要的话,可以重新写一个RESULT来实现。
0

posted @ 2016-08-09 17:49 youngturk 阅读(256) | 评论 (0)编辑 收藏

经典

http://blog.csdn.net/jackfrued/article/details/44921941

posted @ 2016-08-08 15:07 youngturk 阅读(165) | 评论 (0)编辑 收藏

sql行列互转

数据列出来如下:
 ID NAME    COUR SCORE
--- ------- ---- -----
  1 name_1  语文    33
  1 name_1  数学    63
  1 name_1  英语    71
  1 name_1  历史    68
  1 name_1  化学    94
  2 name_2  语文    85
  2 name_2  数学     4
  2 name_2  英语    98
  2 name_2  历史     9
  2 name_2  化学    12
  3 name_3  语文    49
  3 name_3  数学    96
  3 name_3  英语    30
  3 name_3  历史    60
  3 name_3  化学     2
要实现的行转列的效果如下(或者类似的结果):
 ID NAME    SCORES
--- ------- --------------------
  1 name_1  33,63,71,94,68
  2 name_2  85,4,98,12,9
  3 name_3  49,2,60,96,30
通过case表达式
select id,name,sum(case when course='语文' then score end) "语文",
sum(case when course='数学' then score end) "数学",
sum(case when course='英语' then score end) "英语",
sum(case when course='历史' then score end) "历史",
sum(case when course='化学' then score end) "化学"
from HANG2LIE
group by id,name;

union有去重功能:
结构如下:
 ID NAME       Chinese       Math    English    History  Chemistry
--- ------- ---------- ---------- ---------- ---------- ----------
  2 name_2          85          4         98          9         12
  1 name_1          33         63         71         68         94
  3 name_3          49         96         30         60          2
我们要实现如下的查询效果:列转行
 ID NAME     COUR SCORE
--- -------- ---- -----
  2 name_2   语文    85
  1 name_1   语文    33
  3 name_3   语文    49
  2 name_2   数学     4
  1 name_1   数学    63
  3 name_3   数学    96
  2 name_2   英语    98
  1 name_1   英语    71
  3 name_3   英语    30
  2 name_2   历史     9
  1 name_1   历史    68
  3 name_3   历史    60
  2 name_2   化学    12
  1 name_1   化学    94
  3 name_3   化学     2
1、集合查询
实现的SQL语句:
select id,name,'语文' course,chinese score from lie2hang
union
select id,name,'数学' course,math score from lie2hang
union
select id,name,'英语' course,english score from lie2hang
union
select id,name,'历史' course,history score from lie2hang
union
select id,name,'化学' course,chemistry score from lie2hang;

posted @ 2016-08-04 17:51 youngturk 阅读(185) | 评论 (0)编辑 收藏

oracle 分页 伪列 只能小于 不能大于

select * from (select A.*, rownum rn from T_CD_LOC A where rownum > 20) where rn <41 错


select * from (select t.* ,rownum rn from T_CD_LOC t where rownum<=40) where rn>=20 对
firstIndex=0
pageNumber
pageSize=20
select * from (select A.*,rownum rn from T_CD_LOC a where rownum < ((firstIndex+pageNumber+1)*pageSize) where rn >((firstIndex+pageNumber)*pageSize)

posted @ 2016-08-04 08:53 youngturk 阅读(202) | 评论 (0)编辑 收藏

js怎么刷新都不管用

js被缓存了,加控制版本 <script src="../lib_js/paymentplan.js?v=1"></script> 

posted @ 2016-07-13 15:36 youngturk 阅读(193) | 评论 (0)编辑 收藏

Ehcache学习 转2

     摘要: EhCache 分布式缓存/缓存集群开发环境:System:WindowsJavaEE Server:tomcat5.0.2.8、tomcat6JavaSDK: jdk6+IDE:eclipse、MyEclipse 6.6 开发依赖库:JDK6、 JavaEE5、ehcache-core-2.5.2.jarEmail:hoojo_@126.comBlog:http://blog.csdn...  阅读全文

posted @ 2016-07-10 17:14 youngturk 阅读(194) | 评论 (0)编辑 收藏

java 虚拟机监控

3、JConsole监控

     JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。可以利用JDK的JConsole来访问Tomcat JMX接口实施监控,具体步骤如下:

1)首先,打开Tomcat5的bin目录中的catalina.bat文件,添加:

JAVA_OPTS="-Xms512m -Xmx512m -Xmn256m  -XX:PermSize=64m -XX:MaxPermSize=64m  -Djava.rmi.server.hostname=192.168.222.132 -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

-Dcom.sun.management.jmxremote:代表开启JMX的管理功能

2)重启tomcat,并查看监控端口(上面配置的1090)是否已启动

3)打开jdk的bin目录(如C:\Program Files\Java\jdk1.7.0_17\bin)下的JConsole,并输入iP和监控端口进行连接

     

 

监控结果:

     

posted @ 2016-07-09 16:06 youngturk 阅读(163) | 评论 (0)编辑 收藏

hibernate 删除关联表

http://www.itzhai.com/hibernate-one-to-many-association-mapping-configuration-and-the-cascade-delete-problem.html首先举一个简单的一对多双向关联的配置:

一的一端:QuestionType类

package com.exam.entity;
import java.util.Set;
public class QuestionType {
    private String typeName;
    private char typeUniqueness;
    private Set quesion;
    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
    public char getTypeUniqueness() {
        return typeUniqueness;
    }
    public void setTypeUniqueness(char typeUniqueness) {
        this.typeUniqueness = typeUniqueness;
    }
    public Set getQuesion() {
        return quesion;
    }
    public void setQuesion(Set quesion) {
        this.quesion = quesion;
    }
}

配置文件:

<hibernate-mapping package="com.exam.entity">
    <class name="QuestionType" table="exam_question_type">
        <id name="typeName" column="type_name"></id>
        <property name="typeUniqueness"  column="type_uniqueness"/>
        <set name="quesion" inverse="true" cascade="delete">
            <key column="question_type_name"/>
            <one-to-many class="Question"/>
        </set>
    </class>
</hibernate-mapping>

多的一端:Question类

package com.exam.entity;
import java.util.Date;
public class Question {
    private int questionNo;
    private QuestionType questionType;
    private String questionsTitle;
    public int getQuestionNo() {
        return questionNo;
    }
    public void setQuestionNo(int questionNo) {
        this.questionNo = questionNo;
    }
    public QuestionType getQuestionType() {
        return questionType;
    }
    public void setQuestionType(QuestionType questionType) {
        this.questionType = questionType;
    }
    public String getQuestionsTitle() {
        return questionsTitle;
    }
    public void setQuestionsTitle(String questionsTitle) {
        this.questionsTitle = questionsTitle;
    }
}

配置文件:

<hibernate-mapping package="com.exam.entity">
    <class name="Question" table="exam_question">
        <id name="questionNo" column="question_no" >
            <generator class="increment" />
        </id>
        <many-to-one name="questionType" column="question_type_name"/>
        <property name="questionsTitle" column="questions_title" length="200" />    
    </class>
</hibernate-mapping>

首先说明一下一些常用的属性:

<many-to-one>元素包含以下属性:

name:设定映射的持久化类的属性名
column:设定和持久化类的属性对应的表的外键
class:设定持久化类的属性的类型
cascade:设定是否级联
lazy:设定是否延迟加载

<set>元素包含以下属性:

name:设定映射的持久化类的属性名
cascade:设置是否级联
inverse:设定反向控制,如果为true则一的一端不维护外键
<key>:设定与所关联的持久化类对应的表的外键。
one-to-many:设定所关联的持久化类

如果要对一对多关联映射进行级联删除,可以按照上面的举例进行配置:

首先看到一的一端:

<set name="quesion" inverse="true" cascade="delete">
    <key column="question_type_name"/>
    <one-to-many class="Question"/>
</set>

这里设置inverse表示一的一端不维护外键,设置cascade=”delete”表示删除一的一端时对关联到得多的所有的对象也一起删除

再看到多的一端:

<many-to-one name="questionType" column="question_type_name"/>

这里的column表示外键的名,需要和一的一端设置的key标签里的column保持一致,表示维护同一个键值。

可以按照如下的代码执行删除操作:

session.beginTransaction();

QuestionType questionType = (QuestionType) session.load(QuestionType.class, "判断题");            
session.delete(questionType);        
session.getTransaction().commit();

这里使用load查上来的对象是持久状态的(Persistent),只有是Persistent状态的对象才可以使用session.delete()操作进行级联删除,由new创建的对象属于Transient状态,不能进行session.delete()操作。

posted @ 2016-07-09 14:21 youngturk 阅读(289) | 评论 (0)编辑 收藏

hibernate 删除关联表

需要先删子表,再删除主表,否则报错 好文章 http://www.itzhai.com/hibernate-one-to-many-association-mapping-configuration-and-the-cascade-delete-problem.html

posted @ 2016-07-09 14:18 youngturk 阅读(195) | 评论 (0)编辑 收藏

middlegen生成pojo

http://blog.csdn.net/itcareerist/article/details/5896143

posted @ 2016-07-05 14:24 youngturk 阅读(180) | 评论 (0)编辑 收藏

MyBatis 需要研究

http://www.cnblogs.com/xdp-gacl/p/4261895.html

posted @ 2016-06-27 13:47 youngturk 阅读(127) | 评论 (0)编辑 收藏

ftp socket

http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/

posted @ 2016-06-27 12:45 youngturk 阅读(110) | 评论 (0)编辑 收藏

XML面试题

http://blog.csdn.net/sweetsnow24/article/details/7447110 http://jingyan.baidu.com/article/b7001fe1738d9a0e7282dda6.html http://wenku.baidu.com/link?url=YjPcc8q-E9jnAEqsEJQZ7juMw8TICa0q9ppU3ICqEyQJBl4JGQynegQT03DQA0oyA-CxGAtDKJ_pvuvo3prfVeLEsxzC7VUWjWMsQVAxht_ 问题1:XML是什么?   答:XML即可扩展标记语言(Extensible Markup language),你可以根据自己的需要扩展XML。XML中可以轻松定义, 等自定义标签,而在HTML等其他标记语言中必须使用预定义的标签,比如

,而不能使用用户定义的标签。使用DTD和XML Schema标准化XML结构。XML主要用于从一个系统到另一系统的数据传输,比如企业级应用的客户端与服务端。   问题2:DTD与XML Schema有什么区别?   答:DTD与XML Schema有以下区别:DTD不使用XML编写而XML Schema本身就是xml文件,这意味着XML解析器等已有的XML工具可以用来处理XML Schema。而且XML Schema 是设计于DTD之后的,它提供了更多的类型来映射xml文件不同的数据类型。DTD即文档类型描述(Document Type definition)是定义XML文件结构的传统方式。   问题3:XPath是什么?   答:XPath是用于从XML文档检索元素的XML技术。XML文档是结构化的,因此XPath可以从XML文件定位和检索元素、属性或值。从数据检索方面来说,XPath与SQL很相似,但是它有自己的语法和规则。   问题4:XSLT是什么?   答:XSLT也是常用的XML技术,用于将一个XML文件转换为另一种XML,HTML或者其他的格式。XSLT为转换XML文件详细定义了自己的语法,函数和操作符。通常由XSLT引擎完成转换,XSLT引擎读取XSLT语法编写的XML样式表或者XSL文件的指令。XSLT大量使用递归来执行转换。一个常见XSLT使用就是将XML文件中的数据作为HTML页面显示。XSLT也可以很方便地把一种XML文件转换为另一种XML文档。   问题5:什么是XML元素和属性   答:最好举个例子来解释。下面是简单的XML片断。   Xml代码         6758.T   2300         例子中id是元素的一个属性,其他元素都没有属性。   问题6:什么是格式良好的XML   答:这个问题经常在电话面试中出现。一个格式良好的XML意味着该XML文档语法上是正确的,比如它有一个根元素,所有的开放标签合适地闭合,属性值必须加引号等等。如果一个XML不是格式良好的,那么它可能不能被各种XML解析器正确地处理和解析。   问题7:XML命名空间是什么?它为什么很重要?   答:XML命名空间与Java的package类似,用来避免不同来源名称相同的标签发生冲突。XML命名空间在XML文档顶部使用xmlns属性定义,语法为xmlns:prefix=’URI’。prefix与XML文档中实际标签一起使用。下面例子为XML命名空间的使用。   Xml代码      837363223         问题8:DOM和SAX解析器有什么区别   答:这又是一道常见面试题,不仅出现在XML面试题中,在Java面试中也会问到。DOM和SAX解析器的主要区别在于它们解析XML文档的方式。使用DOM解析时,XML文档以树形结构的形式加载到内存中,而SAX是事件驱动的解析器。   问题9:XML CDATA是什么   答:这道题很简单也很重要,但很多编程人员对它的了解并不深。CDATA是指字符数据,它有特殊的指令被XML解析器解析。XML解析器解析XML文档中所有的文本,比如This is name of person,标签的值也会被解析,因为标签值也可能包含XML标签,比如First Name。CDATA部分不会被XML解析器解析。   问题10:Java的XML数据绑定是什么   答:Java的XML绑定指从XML文件中创建类和对象,使用Java编程语言修改XML文档。XML绑定的Java API,JAXB提供了绑定XML文档和Java对象的便利方式。另一个可选的XML绑定方法是使用开源库,比如XML Beans。Java中XML绑定的一个最大的优势就是利用Java编程能力创建和修改XML文档。   以上的XML面试问答题收集自很多编程人员,但它们对于使用XML技术的每个人都是有用的。由于XML具有平台独立的特性,XPath,XSLT,XQuery等XML技术越来越重要。尽管XML有冗余和文档体积大等缺点,但它在web服务以及带宽、速率作为次要考虑因素的系统间数据传输起很大作用,被广泛用于跨平台数据传输。

posted @ 2016-06-24 16:41 youngturk 阅读(156) | 评论 (0)编辑 收藏

SQL SERVER 的用户数,连接,连接池 license

http://www.cnblogs.com/qanholas/p/3904833.html SQL SERVER 理论上有32767个逻辑连接,SQL SERVER根据系统自行调配连接池。 首先 ,操作系统的用户数:即同时通过网络连接到这台电脑上面的用户限制,以5用户操作系统,搭建的文件服务器为例,去同时访问这个文件服务器的网络用户为5个。 下面说说SQL server,购买数据库有两种方式,1、根据用户数购买。2、根据cpu个数购买。 根据用户数购买,假如你购买了一个50用户的数据库,那么可以通过网络访问数据库的人数限制为50。 根据cpu个数购买的数据库访问人数不受限制,服务器上面有几颗cpu就要买几个授权的SQL server,但是如果你只买一个授权的话数据库也可以正常运行,但是微软认为你的数据库不合法。就如同盗版系统。 一个连接不等于一个用户,单独一个用户可以有超过一个的连接,单独一个连接可以有超过一个用户。 你可以运行里面输入perfmon,然后加入下面两个计数器进行对比 SQLServer: General Statistics — Logical Connections:与系统建立的逻辑连接数。SQLServer: General Statistics — User Connections:连接到系统的用户数。 打个比喻 sql server是你家的房子 用户数 是你家房子钥匙 连接数 是你家房子能进去的人 不是很恰当,但是基本能说明问题 一个房子有多少个钥匙是明确的,但是每个钥匙是可以让多个人进去 也就是说,sql server的用户是可以登陆sql server进行操作的,而连接数指的是使用某个用户名登陆的为了执行某个具体操作的一个连接。 通常一个SQL SERVER 查询器,一个ADOCONNECTION是一个连接。 在SQL Server里查看当前连接的在线用户数 use master select loginame,count(0) from sysprocesses group by loginame order by count(0) desc select nt_username,count(0) from sysprocesses group by nt_username order by count(0) desc 如果某个SQL Server用户名test连接比较多,查看它来自的主机名: select hostname,count(0) from sysprocesses where loginame='test' group by hostname order by count(0) desc 如果某个SQL Server用户名test连接比较多,查看它最后一次操作的时间范围分组: select convert(varchar,last_batch,111),count(0) from sysprocesses where loginame='test' group by convert(varchar,last_batch,111) order by count(0) desc 如果从主机(www)来的连接比较多,可以查看它的进程详细情况 select * from??sysprocesses where hostname='www' 如果www机器主要提供网页服务,可能是asp程序处理连接时出了问题, 生成杀这些进程的SQL语句: select 'kill '+convert(varchar,spid) from sysprocesses where hostname='www' 如果这样的问题频繁出现,可以写一个存储过程sp_KillIdleSpids.sql, 写一个作业, 执行它, 来自动杀掉从主机(www)来但已经一天没有响应的用户连接. ? ? ? -------------------------------- SQL Server的用户及权限? ?sysadmin 可以在 SQL Server 中执行任何活动? serveradmin 可以设置服务器范围的配置选项 关闭服务器? setupadmin 可以管理链接服务器和启动过程? securityadmin 可以管理登录和 CREATE DATABASE 权限 还可以读取错误日志和更改密码? processadmin 可以管理在 SQL Server 中运行的进程? dbcreator 可以创建 更改和除去数据库? diskadmin 可以管理磁盘文件? bulkadmin 可以执行 BULK INSERT 语句? ...... 最大连接数是指数据库能承受的最大并发访问数量 SQL Server的并发用户数或者license怎么理解? 华软论坛 2005-12-06 13:38:55 在 MS-SQL Server / 基础类 提问 盗版的有并发用户数的限制吗?正版好像有10用户,50用户的版本,如果用C/S架构的话,每个客户端连接算不算一个用户? 后来有段时间好像改到 只按CPU购买License了。现在又好像见到购买连接数的license. 讲了这么一堆,想告诉你的是,如果你只有10用户的License,其实也是没有限制的。这是微软的市场人员亲口告诉我的。 [华 软 网] 欢迎转载,但请保留出处,本文章转自[华软网] 原文链接:http://www.huarw.com/db/dbbbs/MSSQLServer/200512/735120.html 你指的是购买许可吧? SQL 提供3种购买方式 1) Processor license. (按CPU购买) 要求为运行SQL Server 2000的操作系统上的每个CPU购买许可. 这种方式不需要购买客户端访问许可. 2) Server plus device CALs. (服务器许可加每设备客户端访问许可) 运行SQL Server 2000的服务器需要一个许可, 每个访问SQL Server 2000的设备需要一个客户端访问许可. 3) Server plus user CALs. (服务器许可加每用户客户端访问许可) 运行SQL Server 2000的服务器需要一个许可, 每个访问SQL Server 2000的用户需要一个客户端访问许可 2、每客户 每客户授权模式要求每个将访问 SQL Server 2000 服务器的设备都具有一个客户端访问许可证。对于客户端连接到不止一个服务器的网络,每客户模式通常更划算。 在编辑框中,选择要授权的设备数。 选择授权模式: 使用该对话框设置授权模式,以使客户端可以访问 Microsoft? SQL Server? 的该实例。SQL Server 2000 支持两种客户端访问授权模式,一个用于设备,另一个用于处理器。 设备可以是工作站、终端或运行连接到 SQL Server 实例的 SQL Server 应用程序的任何其它设备。 处理器指的是安装在运行 SQL Server 2000 实例的计算机上的中央处理器 (CPU)。一个计算机上可以安装多个处理器,从而需要多个处理器许可证。 一旦设置了授权模式便无法再更改。可以在安装 SQL Server 之后添加设备或处理器许可证,这使用 "控制面板 "中的 SQL Server 2000 授权安装实用工具来进行。 1、授权模式 当从 "控制面板 "访问该对话框时,安装过程中选择的模式在默认情况下为选中,同时显示以前选择的设备数或处理器数。 2、每客户 每客户授权模式要求每个将访问 SQL Server 2000 服务器的设备都具有一个客户端访问许可证。对于客户端连接到不止一个服务器的网络,每客户模式通常更划算。 在编辑框中,选择要授权的设备数。 3、处理器许可证 使用处理器许可,安装在运行 SQL Server 的计算机上的每个处理器都需要一个许可证。处理器许可证允许任意数目的设备访问服务器,无论它们是通过 Intranet 还是 Internet。 使用处理器许可,SQL Server 2000 可以利用每个安装的处理器,并支持不限数目的客户端设备。通过 Internet 提供对 SQL Server 数据库的访问的客户或拥有大量用户的客户通常选择处理器许可证。 在编辑框中选择要授权的处理器数。 SQL Server安装成功后,重起计算机后SQL Server自动启动服务。 10用户不是指的连接用户 在创建自定义控制台时,可以给控制台指派两种常用访问选项中的一种:作者模式或用户模式。依次有三个级别的用户模式,因此共有四种默认访问控制台的选项: 作者模式 用户模式-完全访问 用户模式-受限访问,多窗口 用户模式-受限访问,单窗口 你安装的是企业版,10个客户端是指你能够在别的机子上只能安装10个Sql客户端同它连接

posted @ 2016-06-24 15:00 youngturk 阅读(480) | 评论 (0)编辑 收藏

三分钟让你看懂java网络通信

http://i-lolo.iteye.com/blog/1611562 在进入网络通信之前,让我们来普及一点网络基础概念。如果你是有一定的计算机网络基础,请直接跳到第五点之后开始阅读。 第一、 什么是计算机网络? 书本上那些文绉绉的概念我们可以不去理,我告诉你,我们两台电脑连在一起就组成了一个计算机网络。其实我们的电脑甚至是全世界的电脑都是连着的,只要你的电脑连着网,你就在这个巨大的计算机网络里,你也许会问为什么我和他们是连着的啊?大家知道自己是怎么上的网?ADSL是吧,拨号上网。换个比方说吧,我们在公司我们的电脑通过网线,双绞线,然后是Hub(集线器),连接到胡哥的电脑,然后胡哥的机子通过拨号,ADSL,连到电信的网关那儿,然后中国电信通过海底光缆和美国电信网关连接,然后再像刚刚我们连接中国电信一样,逆推过去,连接到美国每一台联网的计算机。所以说只要你连着网,你就是和全世界的在线用户连着。这是一个巨大的计算机网络。非常巨大。 第二、 计算机网络的主要功能? 资源共享、信息传输与集中处理、均衡负荷与分布处理、综合信息服务(www/综合数字网络 ISDN)。这些个功能,不多说。这些你不平时都在用么?你的资源能够上传共享给其他人,有的人平时还很喜欢聊QQ,是吧,所以上面说的这四个也许还有更多的什么功能都是些冠冕堂皇的话,稍微看下就好。用了自然就晓得了。 第三、 什么是网络通信协议? 我来问你,为什么你说话身边的人能够听的懂,别人说的话你为什么也能够听懂,而为什么如果你去对一个外国人说话或者一个外国人来和你说话你们却互相听不懂呢?你会说废话嘛因为我说的是中文,是汉语,中国人说的都是汉语,而外国人说的是另一种语言,是外语。就是这样,网络通信协议就像我们的中文一样,她就是我们之间的共同语言,他规定了我们之间怎么说话,我先说什么你再说什么,你怎么说,而我应该怎么听。而网络通信得先规定约定一些俗成的网络通信协议,先说好,两台计算机之间什么收发信息,信息格式是什么,信息怎么发,怎么接收,而万一出错怎么办怎么处理。没有了这个协议,两台电脑就不知道互相之间怎么说话,就像你对一头大母猪说完爱你,而人家根本就不知道你在说什么。 在这儿和大家提一下网络协议的分层思想。学过计算机网络的同学都知道有两种基本的国际标准分层模型,一个是OSI参考模型,一个是TCP/IP参考模型。OSI参考模型,是国际标准化组织搞出来的开放互联传统模型,一共有七层:物理/数据链路/网络/传输/会话/表示/应用。学网络和硬件的一般都要熟悉这七层标准,至于这七层都是干嘛的,大家自己问度娘或者自己看关于网络的书去。(中南大学高阳教授主编了一本叫《计算机网络原理与实用技术》的书,里边很详尽的介绍了这个OSI参考模型,没记错的话应该是在第一章1.4.5里,是放在TCP/IP协议之后的……)这里就不多说了,因为对于咱们编程的软件人员来说,实际当中的应用,是分为四层,也就是TCP/IP参考模型。最底层物理+数据链路层/网络层/传输层/应用层。我们编的程序是位于应用层,所以说,我们一直是在和哪一层打交道?TCP/IP层。我们编写一个程序发送一些数据,发给传输层,TCP/IP层,在这一层对数据进行封装,按照先前约定的协议,然后走向下一层,通过网线,再走到物理数据链路层,这时候数据就变成了一连串的01010101,到达对面之后逆推上面的过程,进行解封,ok,信息发送完毕。这儿涉及到比较多的网络底层,目前我们不需要过多了解,因为我们要做的工作不需要了解牵扯到到这么底层的东西,如果你想深入了解或者今后你想做杀毒软件什么的,去读《TCP/IP详解》。 第四、 IP——(Internet Protocol网络之间互连的协议)? 你不用管其他的,你只需要知道IP这个东西给我们做出的最大贡献,就是给我们每一台电脑提供了一个独一无二的IP地址。你想我的机器要和你的机器交流说话,我得知道你的机器叫什么,你的机器得有一个独一无二的区别标识,否则的话我就不知道传的信息有没有传到你那儿,也不知道这信息到底传给谁。IP地址这东西我们都知道吧?像我的本机IP: 113.240.187.242 这是湖南省长沙市的IP。他是由四个字节组成的(也就是说每一个值不能超过255)。(这个是IPV4,能够组成将近四亿多地址,现在已经出来了IPV6,高档货,八个字节,地址数是IPV4的几何倍数)IPV4的IP地址按照其网络IP段和主机IP段占的字节数分ABC三类网。这个这里不说,大家自己去了解,好吧?拿高阳教授的那本书翻翻。顺带看看子网掩码啊网关啊什么的。自己去了解。在这儿我就累得给你敲了。 第五、 TCP协议和UDP协议? 好了,上一步里我们通过独一无二的IP地址找到了对方连在了一起。我们可以通话了,关于通话我们有两种方式: 第一、 TCP协议,什么叫TCP协议?Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。什么叫可靠的?打个比方,我们打电话,上一步通过IP找到对方就相当于拨号打通了你的电话,你拿起电话接了,我说一句“喂?”,如果你这边不回应,我就会杵这儿一直“喂”下去,是不?因为不知道你那边到底接到了听到了我的话没有,所以你这边一定要告诉我你听到了你收到了我刚刚的那句信息,我才会接着给你说下面的话给你发下面的数据。我每发一次信息我要你给我确认收到了,然后我再给你发接下来的东西,这个就叫可靠。在TCP/IP协议里边这叫“三次握手”机制。怎么握手,握手是怎么回事,问度娘,好吧? 第二、 UDP协议。User Datagram Protocol的简称, 中文名是用户数据报协议,是 OSI 参考模型中一种无连接的传输层协议。UDP这种方式相对于TCP来说更加简单。UDP说话就是,我给你说一句话,你听没听到我不管。就像发电报,“黄河黄河我是长江!”哐当一下就发出去了。不管黄河收到没有。两种方式一种安全可靠但是慢,一种简单快捷但是不可靠。根据不同的需求选择。像我们平时聊QQ开视频啊什么的,用的就是UDP,因为我们传输的这些个数据丢个一两个包什么的无所谓,顶多就是视频多了几个马赛克,是吧。那么平时我们玩的网络游戏,像CF啊魔兽世界啊,是哪一种呢?自己想,好吧? 第三、 中南-马志丹 http://java-mzd.javaeye.com 惊喜看得到! 基础普及完了,接下来我们来看看为什么要去做网络通信。这一段我就简单点说。在计算机刚出来那会儿 ,那时候的人们都觉得计算机这东西就是主要为计算而存在的就是一个计算工具,但是自从1983年起,TCP\IP协议的出现,让计算机从此转变为了人们的一个交流工具。自那以后,只要你有一台电脑,不管你是开网页看电影,还是上人人找朋友,不管你是登邮箱收发邮件,还是登QQ聊天,你的生活的方方面面都离不开那电脑屏幕后边的网络技术。换句话说,如果没有了网络通信技术,电脑以及大多数软件将会失去他们原有的生命力。就像一棵大树没有根。没有网络通信就没有如今繁荣的QQ世界,没有了网络通信,世界上那些个IT巨头诸如IBM诸如谷歌,将会如断线风筝落日残阳。我想说,如果你不懂网络通信技术,你就不是一个合格的程序员,如果你不精通网络通信技术,你就无法开发出一款真正优秀的营运软件!除非你想永远停留在枯燥的单机时代,你想让自己的技术永远留在表层。 现在,让我们来考虑如何实现。 在做实现之前,我想先让大家明白几个概念: 1) Socket A. 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket B. Socket通常用来实现client-server连接 C. Java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端 D. 建立连接时所需要的寻址信息为远程计算机的IP地址和端口号(Port number) 上面我们提到了IP地址,那是每一台电脑独一无二的一个地址标识,是为了对方计算机能够找得到你给你发信息。建立连接我们很显然需要这个信息才能够完成。那么这个端口号又是用来干什么的呢?举个例子,假如说我电脑上现在上着人人和QQ,你的电脑上也是上着人人和QQ,如果我用QQ给你发一条消息他怎么知道就发到你的QQ上而不会在你的人人上呢?是吧?所以说光用IP地址是无法区分到不同的应用程序的。所以需要端口号来达到这个作用。端口号在计算机内部是用两个字节来表示,也就是说总共有65536个端口。在这儿需要注意下面两个点: •1.1024之前的端口我们自己编的程序不要征用它,因为这些端口是给系统用的。比如说80端口,胡哥给咱们讲过的。干嘛的?负责处理HTTP上网访问网页等等的端口。还有就是21端口,FTP的,是吧?还有其他的一些著名端口,想知道问度娘去,好吧?在这里就不罗嗦了。 •2.TCP端口和UDP端口是分开的,比如说TCP有个8888端口,他和你的UDP8888端口是不一样的。 •3.上述每一类有65536个端口。也就是说我们的计算机能够运行131072个程序,只要你电脑吃得消。 既然要实现通信,那我们肯定要确定两个通信对象,一个是服务器对象server,一个是客户端对象client。我们需要知道,这两个对象是两个应用程序,他们的对话,是两个不同的程序之间的对话。你会说我只有两个对象也还没法实现他们之间的交互啊,不用急,我也知道他们两个不是神仙会心有灵犀。两个对象之间想要实现互相之间的信息交互,就必须要有一个通道。这个通道就像是一根管子,一头扎在服务器端,一头插在客户端。信息就在这根管子里来来往往。这根管子怎么插呢,插在哪儿呢?这个时候就需要用到刚刚提到的Socket了。 Socket的意思呢就是一个插座,服务器和客户端各有一个插座,安插在各自的一个端口上,管子插在这两个插座上,然后在他们这两个端口上接入数据流。Socket通常用来实现server-client连接。Java里面有一个包java.net,他下边有定义了两个类,Socket和ServerSocket,分别用来实现双向连接的server端和client端。 接下来我们来建立TCP服务器端和客户端。 服务器端:我们用的是ServerSocket,新建一个server插座,并且交给他一个端口号,这个插座他有一个非常方便的构造方法ServerSocket(int port),让他知道自己监听哪一个端口,然后新建一个socket对象,开机,并用.accept语句让他处在待机状态,等待接受client的接入。一旦有客户端接入就将它赋给新建的Socket对象,并且用.getInputStream以及.getOutputStream命令获得他的输入输出流。这个流,就是一根管子,信息都在这根管子里流通。这样说东西不怎么好说,那么我们就在这个流上面再包一层,将这个流封装成DataOutputStream(),DataInputStream。然后就可以利用输出流(这个是相对于服务器来说,这个输出流到了客户端就成了输入流了)来.write信息,利用输入流来.read()获取客户端发来的信息。Ok,接收完了,.close关闭输入输出流,以及关闭socket,关机。 客户端:写法和服务器端有点类似,新建一个插座,这儿需要留意的是,客户端需要用到的插座是Socket而不是ServerSocket,新建一个Socket牌插座,同样用他的Socket(String host,int port)构造方法方法给他一个IP地址和端口号,让它拨打区号以及具体电话号,这个和服务器端的IP地址以及端口号要一致,ok,这个时候server就相当于申请连接到服务器的某一个端口上了。两个程序就等于是连接上了。但是有些人就会问了啊,这只是客户端申请连接,人家服务器接不接受呢。好,前面我们的服务器不是提到了.accept么,这个方法就是用来接受客户端的,这个时候就是:你申请连接,我接受连接,接下来,照着上面服务器一样,客户端也获取到自己的输入输出流,封装,用输出流写出信息。咱们之间就可以互相通信了。还有一个问题啊,要是如果有另一个客户端接入了呢?简单,那就再.accept一下。如果有N多客户端接入,那就不断的.accept,不断循环它。这个问题大家都知道可以用while语句。 具体的敲法,请看我给大家附上的代码实现。下面给大家看下Socket通信模型。看着这个模型,再回头看看上面给大家唠叨的那些个点,我想大家都知道服务器和客户端该怎么去写怎么去实现通信了吧? 好了,这一段“三分钟让你看懂”到此就结束了,想来大家对网络通信也该有了一个相对清晰的认识。如果你还想了解学习更多的网络通信方面的知识,如果你还想知道如何去实现一些更多的通信功能,比如建立公共聊天室实现群聊,又比如建立一个以互联网为基础的以网络画板为主体的协助平台,又比如,你想做一个自己的软件来实现像QQ一样MSN一样或者像人人桌面一样的各种功能……请继续关注我们的随后更新。请记住,我们是ZCL,我们是一群简单快乐的牧码人! 后记:第一篇正儿八经的技术日志,4K多全手打,这样说起来应该蛮自豪的感觉。但是说实话还是觉得自己写的有些乱。自己只是把课堂上老师们讲的一些知识点,根据自己敲的代码以及做了的一些课堂笔记,罗列了出来。也查了一些在线资料和书籍,像度娘,像学校发的那本我都没怎么动过的《计算机网络原理和实用技术》。在前面花了好些篇幅来讲计算机网络基础知识,是因为我给自己定下的目标就是让任何一个人甚至你是没怎么学过接触过java或者计算机网络这一块,看了我的博客之后,都能够对网络通信有一个比较清晰的认识,而让接触过java的人知道怎么样初步的去实现两个软件或者说程序之间的通信,知道他们之间是怎么回事儿并且自己动手实现它。这确实是一个有点难度的过程。但是你如果把这个都搞定了,那么,你的java网络通信就基本可以说入了一个门了。我似乎听见了胡哥用他那一惯的口吻在我身后说,这种程度,要说入门还早的很呢!当然咯,就算我现在做到网络画图板做到网络文件传输,也感觉自己只是进了一个门,门后的世界无比之大,等待我们不断的去探索,去创新,去创造它。生命有限,学海无涯;人有老时,学无止境嘛。发现的问题蛮多。但获得的收获也不少。果然检验自己是否学会掌握一个东西的最好办法就是尝试着去教给别人。只有你能够很清晰的把事儿给别人说清楚了教会了,你才能说自己懂了。写完这篇博客,感觉自己对网络通信的理解又加深了一些,对其中的一些知识点的掌握也更加牢靠了一些。只言片语薄闻浅见,希望大家多多批评不吝赐教! 最后的最后:用胡哥的一句话来与君共勉吧! 标准即平庸,合格即废物。 (附)服务器端代码: Java代码 收藏代码 package con120722; import java.net.*; import java.io.*; public class Server { private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWriter out; public Server() { try { ss = new ServerSocket(10000); while (true) { socket = ss.accept(); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); String line = in.readLine(); out.println("you input is :" + line); out.close(); in.close(); socket.close(); } } catch (IOException e) {} } public static void main(String[] args) { new Server(); } } 客户端代码: Java代码 收藏代码 package con120722; Java代码 收藏代码 import java.io.*; import java.net.*; public class Client { Socket socket; BufferedReader in; PrintWriter out; public Client() { try { socket = new Socket("localhost", 10000); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(),true); BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); out.println(line.readLine()); line.close(); out.close(); in.close(); socket.close(); } catch (IOException e) {} } public static void main(String[] args) { new Client(); } }

posted @ 2016-06-23 10:02 youngturk 阅读(227) | 评论 (0)编辑 收藏

Xms Xmx PermSize MaxPermSize 区别 java 内存

http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html http://www.educity.cn/wenda/450855.html Eclipse崩溃,错误提示: MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains. It is strongly recommended that you exit and restart MyEclipse with new virtual machine memory paramters to increase this memory. Failure to do so can result in data loss. The recommended Eclipse memory parameters are: eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1.参数的含义 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配 我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。 可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的, 所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配 JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制; 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。 非堆内存分配 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关, -server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有实验。) 上面错误信息中的PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。还没有弄明白PermGen space是属于非堆内存,还是就是非堆内存,但至少是属于了。 XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。 说说为什么会内存益出: (1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。 (2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。 这种错误常见在web服务器对JSP进行pre compile的时候。 2)JVM内存限制(最大值) 首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因: 1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize; 2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是, 如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则: 参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机, 在eclipse.ini文件中要写成这样: -vm C:/Java/jre1.6.0/bin/javaw.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。 另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的: -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m -vmargs -Xms40m -Xmx256m 其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数, 而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。 4. 其他的启动参数。 如果你有一个双核的CPU,也许可以尝试这个参数: -XX:+UseParallelGC 让GC可以更快的执行。(只是JDK 5里对GC新增加的参数) 补充:   如果你的WEB APP下都用了大量的第三方jar,其大小超过了服务器jvm默认的大小,那么就会产生内存益出问题了。 解决方法: 设置MaxPermSize大小 可以在myelipse里选中相应的服务器比如tomcat5,展开里面的JDK子项页面,来增加服务器启动的JVM参数设置: -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 或者手动设置MaxPermSize大小,比如tomcat, 修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存 1.JVM内存管理的机制   内存空间划分为:Sun JDK在实现时遵照JVM规范,将内存空间划分为堆、JVM方法栈、方法区、本地方法栈、PC寄存器。 堆: 堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例;当空余堆内存大于70%时,JVM会减小Heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRatio=来指定这个比例,对于运行系统而言,为避免在运行时频繁调整Heap 的大小,通常将-Xms和-Xmx的值设成一样。 JVM方法栈: 为线程私有,其在内存分配上非常高效。当方法运行完毕时,其对应的栈帧所占用的内存也会自动释放。当JVM方法栈空间不足时,会抛出StackOverflowError的错误,在Sun JDK中可以通过-Xss来指定其大小。 方法区: 要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun JDK中这块区域对应Permanet Generation,又称为持久代,默认最小值为16MB,最大值为64MB,可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值。 本地方法栈: 用于支持native方法的执行,存储了每个native方法调用的状态。在Sun JDK的实现中,和JVM方法栈是同一个。 PC寄存器: 占用的可能为CPU寄存器或操作系统内存。 2.Java堆和栈的区别   Java把内存划分成两种:一种是栈内存,一种是堆内存。   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。   堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。   引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制。 3.Java内存泄露和内存溢出   内存泄漏:分配出去的内存回收不了   内存溢出:指系统内存不够用了

posted @ 2016-06-21 21:58 youngturk 阅读(319) | 评论 (0)编辑 收藏

java面试题:如何解决内存溢出

http://zhidao.baidu.com/link?url=gQ4IAoIl07v0sxITrvasf8LwMwmFELou2d-6w11tqNHsNNdxQvDTg5f-EMlS0HSrAOG0mqw0DoBocICbuSfTvK 第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查, 1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。 2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类, 算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。 3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。 1),变量所包含的对象体积较大,占用内存较多。 2),变量所包含的对象生命周期较长。 3),变量所包含的对象数据稳定。 4),该类的对象实例有对该变量所包含的对象的共享需求。 4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。 第二还有就是String类相关的东西: 1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。 2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。 int size = xmlVector.size(); for (int i = 2; i < size; i++) { ... } 3 .写代码的时候处理内存溢出 try{ //do sth .... }catch (outofmemoryerror e){//可以用一个共通函数来执行. system.out.print (“no memory! ”); system.gc(); //do sth again .... }   4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。 Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。 1.优化程序2.改进算法3.增加jvm内存分配

posted @ 2016-06-21 21:37 youngturk 阅读(300) | 评论 (0)编辑 收藏

jquery中ajax处理跨域的三大方式 ,jQuery学习之jQuery Ajax用法详解

http://www.jb51.net/article/77470.htm http://www.php100.com/html/program/jquery/2013/0905/6004.html

posted @ 2016-06-20 23:10 youngturk 阅读(144) | 评论 (0)编辑 收藏

我的理解--关于jmx

http://bhsc-happy.iteye.com/blog/678163
http://www.cnblogs.com/Javame/p/3881187.html
JMX Java Management Extensions,Java管理扩展,初步看了些资料,以为是专门管理,监控jvm的一些信息的,特别是visual VM这个监控jvm的东西,还有一个添加JMX连接的时候(我自己想错了,那样的话应该叫jvm Management Extensions),其实他能使得基于java语言开发的程序能被管理,并且是可扩展的。 Jdk以前是通过JVMPI之类来监测Java程序运行中的jvm和系统的一系列情况,现在通过jmx就可以做到,这是通过java.lang.management 包来实现的,这个包是 JMX 在 JDK方面 的一个应用,并不是表示jmx就是一个监控jvm的东西。 我们可以用jmx来监控我们的系统,通过公布API的方式,但是,这里采用监控这个词,也是受了前面的例子的影响,实际上,个人觉得,就可以用jmx来开发我们的系统。 现在的jboss,hibernate,tomcat各种应用都号称实现了JMX规范,将可管理,可调用的MBean注册到MBeanServer中,通过一种类似“web服务”的方式公布出去,并且伴有一个名字,可以通过该名字找到该MBean。并且,这里的MBean是可以被管理的,说到这里又想到了OSGI。 JMX与Web Service 个人认为,我们实现JMX规范,将东西发布出去,和通过web Service的方式是很类似的,也是可以远程调用的,只是相对的web Service的方式更加SOA一些,不过JMX号称也要提供对非java客户端的支持,也就是跨语言了吧。。。 现在的JMX连接方式: JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); 看了下源码,貌似还是通过RMI来实现的,不知道它要怎么实现非java客户端支持。 从这里,我觉得JMX可以实现的,我们也都可以通过web Service实现,只是看在它有个“M”上,以后如果有什么系统管理,监控方面的,可以考虑使用它,也许开发,个人觉得还是使用web service好一些。 说到这里,感觉OSGI与JMX也好像,在看到JMX能够对MBean进行管理的时候,我就觉得跟OSGI很像,OSGI管理的是Bundle,找了找资源,原来早就有人考虑过了: http://teamojiao.iteye.com/blog/438334 顺便,在查资料的时候,发现一个东西, if your question means, how to manage an OSGi runtime with JMX, you should have a look at MAEXO (http://code.google.com/p/maexo/). With MAEXO bundles up and running you will transparently get MBeans for a fair amount of services of the OSGi runtime as well as MBeans for your own services and bundles. Just have a look at the screencast. 摘一些话:仅做参考 <网友回复> 一个大系统中,各内部模块系统之间的基于接口方式的互相调用和治理,使用jmx是最佳方案. 带来的好处是 1.面向接口,远程调用对于开发人员是透明的,模块在调用jmx接口时,与调用本地方法几乎相同. 2.可视化的治理界面, 通过 Jconsole等jmx客户端,可以实时监控系统,并且可实时调用方法进行某些操作. 典型应用场景:  某聊天系统,一台服务器作为 在线用户列表服务器 A1, n台服务器为用户提供聊天业务处理 N1 ,N2,N3..., 一台服务器作为后台治理系统A2.  系统治理员现在进行下面这样一个操作,察看某用户是否在线,找到该用户,发现其在线,则将该用户加入黑名单,并踢下线. 对应的jmx接口可以由以下几个:  A1为A2提供查询在线用户jmx接口,加入黑名单接口,kickout接口, A1为N1..等服务器提供以下接口: 注册业务服务器,添加在线用户.查找黑名单用户 N1...到N3为A1提供kickout接口. 因此在上面的踢下线操作,则由用户在A2的web界面发出,交由A1执行,A1记录黑名单之后,再找到用户所在业务服务器调用N1提供的接口让用户下线. 以上情形是在生产环境下的部署,而在开发工作,则可以将A1,A2,N...N3等功能合并在一个应用中调试. 由于使用的是jmx接口,在本地调试合并之后,可以直接调用应用内部接口方法. 这样借助jmx实现的应用模块的灵活组装与拆分,使得系统的可以根据负载需要,根据性能情况,灵活的拆分和整合部署分布式的应用. 替代方案,选择webservice,xmlrpc等,但是这些都需要手工编写或用工具生成大量的代码来辅助完成接口间的java对象序列化 。 经典jmx案例: 1.Jboss.使用jmx治理内部的各个service。 2. 基于java的开源网管软件 Hyperic HQ ,通过jmx与各被治理资源进行通讯和信息采集. <网友回复>JMX是一个治理的框架。 当我们想使用JMX的时候,就要问,我们的系统当中有需要监控治理的资源或者对象吗?实事求是一点,我们不能为了想使用一个高端的技术,就歪曲系统的本来面目。 假如第一个问题是肯定的,接下来就是看这些资源是否有生命周期。 经典案例:jboss就是将所有可部署的组件作为资源来治理,这些组建都有其生命周期。这个理念甚至延伸到了其系统内部,将其内部的服务作为组件纳入到 JMX中来,成就了jboss基于jmx的微内核系统。

posted @ 2016-06-20 09:40 youngturk 阅读(143) | 评论 (0)编辑 收藏

<2016年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

公告

this year :
1 jQuery
2 freemarker
3 框架结构
4 口语英语

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

相册

EJB学习

Flex学习

learn English

oracle

spring MVC web service

SQL

Struts

生活保健

解析文件

搜索

最新评论

阅读排行榜

评论排行榜