java socket编程编程

欢迎访问雨轩博客,Java信息 Java教程 推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入雨轩博客
业快半年了,不是专业的码农了,以后的工作相对比较清闲,但总感觉少点什么,想培养自己的一些兴趣,就从这里开始吧!
开始学习android开发一个多月了,学着写了一些代码,觉着还是要学一点总结一点才会有收获,就从这里开始吧!
package com.
import j...
近日,网络上盛传黑客自述的故事:黑客破解了邻家“女神”wifi的密码,她的微信、微博、QQ,甚至电视上的外接设备,都暴露在黑客眼里。黑客真能做到这一步吗?“女神”又该如何防范呢?
是否普通人使用黑客软件也能轻易破解WiFi密码呢?复旦大学计算机科学技术学院的叶工告诉本报记者,首先...
Ionic 环境配置
保证apache-ant、js、android(ios)环境的存在。
cmd: npm install -g cordova
回车等待完成
npm install -g ionic 回车等待完成
进入你要创建项目的路径
cd 要创...
1周前 (08-14)
如果你是刚搭建起来的论坛 没有人气 不想被别人看到这个 而dz自己又没有这个功能 怎么办呢?
下面就要靠我们自己动手了 首先我们到网站跟目录下面
目录层次依次是:
/data/template/1_diy_forum_discuz.tpi.php
在34行有个div 里面的p标签...
2周前 (08-11)
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().b...
3周前 (08-05)
这篇文章主要介绍了php使用curl获取https请求的方法,涉及curl针对https请求的操作技巧,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了php使用curl获取https请求的方法。分享给大家供大家参考。具体分析如下:
今日在做一个项目,需要curl获取...
3周前 (08-03)
日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设...
3周前 (08-03)
是时候放上我女神的照片了。
阿波罗计划的首席软件工程师玛格丽特·汉密尔顿站在阿波罗项目中导航计算机源代码旁边,正是这些代码把人送上了月球。
我们来看看为什么这些代码是神操作:
1. 火箭和飞船上的代码开发难度完爆其他人说的电脑上的代码(不管是磁心线还是打孔卡片),在计算机...
3周前 (07-31)
之前,一位认证信息为小米员工的网友在微博上发言,“iPhone 6 用户都不在意 1G 内存不够,红米 2 的 1G 内存够用了,保持流畅的秘诀就是少装 App.”后来的事情大家知道了。
要保持安卓手机流畅,少装 App 确实有用,不过 iPhone 6 是否流畅和少装 App ...
4周前 (07-30)
程序员怎样才能年薪百万呢?让我们以关二爷为例来说说程序员怎么才能达成呢?
吕布明显比关羽技术好,比关羽技术好的可能还有典韦许褚马超呢,但是关羽的薪水会比其他人高很多。
关二爷有能力砍人,而且为了一个崇高的信念去砍人,在多个关键时刻砍了关键的人,最后能坚持砍人一辈子,至...
4周前 (07-30)Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。
这话其实也没有太大问题,的确,大部分场景下关心内存、GC的问题,显得有点“杞人忧天”了,高老爷说过:
过早优化是万恶之源。
但另一方面,什么才是“过早优化”?
If we could do things right for the first time, why not?
事实上JVM的内存模型(
)理应是Java程序员的基础知识,处理过几次JVM线上内存问题之后就会很明显感受到,很多系统问题,都是内存问题。
对JVM内存结构感兴趣的同学可以看下
这篇文章,本文就不再赘述了,本文也并不关注具体的GC算法,相关的文章汗牛充栋,随时可查。
另外,不要指望GC优化的这些技巧,可以对应用性能有成倍的提高,特别是对I/O密集型的应用,或是实际落在YoungGC上的优化,可能效果只是帮你减少那么一点YoungGC的频率。
但我认为,优秀程序员的价值,不在于其所掌握的几招屠龙之术,而是在细节中见真著,就像前面说的,如果我们可以一次把事情做对,并且做好,在允许的范围内尽可能追求卓越,为什么不去做呢?
一、GC分代的基本假设
大部分GC算法,都将堆内存做分代(Generation)处理,但是为什么要分代呢,又为什么不叫内存分区、分段,而要用面向时间、年龄的“代”来表示不同的内存区域?
GC分代的基本假设是:
绝大部分对象的生命周期都非常短暂,存活时间短。
而这些短命的对象,恰恰是GC算法需要首先关注的。所以在大部分的GC中,YoungGC(也称作MinorGC)占了绝大部分,对于负载不高的应用,可能跑了数个月都不会发生FullGC。
基于这个前提,在编码过程中,我们应该尽可能地缩短对象的生命周期。在过去,分配对象是一个比较重的操作,所以有些程序员会尽可能地减少new对象的次数,尝试减小堆的分配开销,减少内存碎片。
但是,短命对象的创建在JVM中比我们想象的性能更好,所以,不要吝啬new关键字,大胆地去new吧。
当然前提是不做无谓的创建,对象创建的速率越高,那么GC也会越快被触发。
分配小对象的开销非常小,不要吝啬去创建。
GC最喜欢这种小而短命的对象。
让对象的生命周期尽可能短,例如在方法体内创建,使其能尽快地在YoungGC中被回收,不会晋升(romote)到年老代(Old Generation)。
二、对象分配的优化
基于大部分对象都是小而短命,并且不存在多线程的数据竞争。这些小对象的分配,会优先在线程私有的 TLAB 中分配,TLAB中创建的对象,不存在锁甚至是CAS的开销。
TLAB占用的空间在Eden Generation。
当对象比较大,TLAB的空间不足以放下,而JVM又认为当前线程占用的TLAB剩余空间还足够时,就会直接在Eden Generation上分配,此时是存在并发竞争的,所以会有CAS的开销,但也还好。
当对象大到Eden Generation放不下时,JVM只能尝试去Old Generation分配,这种情况需要尽可能避免,因为一旦在Old Generation分配,这个对象就只能被Old Generation的GC或是FullGC回收了。
三、不可变对象的好处
GC算法在扫描存活对象时通常需要从ROOT节点开始,扫描所有存活对象的引用,构建出对象图。
不可变对象对GC的优化,主要体现在Old Generation中。
可以想象一下,如果存在Old Generation的对象引用了Young Generation的对象,那么在每次YoungGC的过程中,就必须考虑到这种情况。
Hotspot JVM为了提高YoungGC的性能,避免每次YoungGC都扫描Old Generation中的对象引用,采用了 卡表(Card Table) 的方式。
简单来说,当Old Generation中的对象发生对Young Generation中的对象产生新的引用关系或释放引用时,都会在卡表中响应的标记上标记为脏(dirty),而YoungGC时,只需要扫描这些dirty的项就可以了。
可变对象对其它对象的引用关系可能会频繁变化,并且有可能在运行过程中持有越来越多的引用,特别是容器。这些都会导致对应的卡表项被频繁标记为dirty。
而不可变对象的引用关系非常稳定,在扫描卡表时就不会扫到它们对应的项了。
注意,这里的不可变对象,不是指仅仅自身引用不可变的final对象,而是真正的Immutable Objects。
四、引用置为null的传说
早期的很多Java资料中都会提到在方法体中将一个变量置为null能够优化GC的性能,类似下面的代码:
List&String& list = new ArrayList&String&();
// some code
list = // help GC
事实上这种做法对GC的帮助微乎其微,有时候反而会导致代码混乱。
我记得几年前 @rednaxelafx 在HLL VM小组中详细论述过这个问题,原帖我没找到,结论基本就是:
在一个非常大的方法体内,对一个较大的对象,将其引用置为null,某种程度上可以帮助GC。
大部分情况下,这种行为都没有任何好处。
所以,还是早点放弃这种“优化”方式吧。
GC比我们想象的更聪明。
五、手动档的GC
在很多Java资料上都有下面两个奇技淫巧:
通过Thread.yield()让出CPU资源给其它线程。
通过System.gc()触发GC。
事实上JVM从不保证这两件事,而System.gc()在JVM启动参数中如果允许显式GC,则会触发FullGC,对于响应敏感的应用来说,几乎等同于自杀。
So,让我们牢记两点:
Never use Thread.yield()。
Never use System.gc()。除非你真的需要回收Native Memory。
第二点有个Native Memory的例外,如果你在以下场景:
· 使用了NIO或者NIO框架(Mina/Netty)
· 使用了DirectByteBuffer分配字节缓冲区
· 使用了MappedByteBuffer做内存映射
由于Native Memory只能通过FullGC(或是CMS GC)回收,所以除非你非常清楚这时真的有必要,否则不要轻易调用System.gc(),且行且珍惜。
另外为了防止某些框架中的System.gc调用(例如NIO框架、Java RMI),建议在启动参数中加上-XX:+DisableExplicitGC来禁用显式GC。
这个参数有个巨大的坑,如果你禁用了System.gc(),那么上面的3种场景下的内存就无法回收,可能造成OOM,如果你使用了CMS GC,那么可以用这个参数替代:-XX:+ExplicitGCInvokesConcurrent。
关于System.gc(),可以参考 @bluedavy 的几篇文章:
六、指定容器初始化大小
Java容器的一个特点就是可以动态扩展,所以通常我们都不会去考虑初始大小的设置,不够了反正会自动扩容呗。
但是扩容不意味着没有代价,甚至是很高的代价。
例如一些基于数组的数据结构,例如StringBuilder、StringBuffer、ArrayList、HashMap等等,在扩容的时候都需要做ArrayCopy,对于不断增长的结构来说,经过若干次扩容,会存在大量无用的老数组,而回收这些数组的压力,全都会加在GC身上。
这些容器的构造函数中通常都有一个可以指定大小的参数,如果对于某些大小可以预估的容器,建议加上这个参数。
可是因为容器的扩容并不是等到容器满了才扩容,而是有一定的比例,例如HashMap的扩容阈值和负载因子(loadFactor)相关。
Google Guava框架对于容器的初始容量提供了非常便捷的工具方法,例如:
Lists.newArrayListWithCapacity(initialArraySize);
Lists.newArrayListWithExpectedSize(estimatedSize);
Sets.newHashSetWithExpectedSize(expectedSize);
Maps.newHashMapWithExpectedSize(expectedSize);
这样我们只要传入预估的大小即可,容量的计算就交给Guava来做吧。
如果采用默认无参构造函数,创建一个ArrayList,不断增加元素直到OOM,那么在此过程中会导致:
多次数组扩容,重新分配更大空间的数组
多次数组拷贝
七、对象池
为了减少对象分配开销,提高性能,可能有人会采取对象池的方式来缓存对象集合,作为复用的手段。
但是对象池中的对象由于在运行期长期存活,大部分会晋升到Old Generation,因此无法通过YoungGC回收。
并且通常……没有什么效果。
对于对象本身:
如果对象很小,那么分配的开销本来就小,对象池只会增加代码复杂度。
如果对象比较大,那么晋升到Old Generation后,对GC的压力就更大了。
从线程安全的角度考虑,通常池都是会被并发访问的,那么你就需要处理好同步的问题,这又是一个大坑,并且同步带来的开销,未必比你重新创建一个对象小。
对于对象池,唯一合适的场景就是当池中的每个对象的创建开销很大时,缓存复用才有意义,例如每次new都会创建一个连接,或是依赖一次RPC。
· 数据库连接池
· TCP连接池
即使你真的需要实现一个对象池,也请使用成熟的开源框架,例如Apache Commons Pool。
另外,使用JDK的ThreadPoolExecutor作为线程池,不要重复造轮子,除非当你看过AQS的源码后认为你可以写得比Doug Lea更好。
八、对象作用域
尽可能缩小对象的作用域,即生命周期。
如果可以在方法内声明的局部变量,就不要声明为实例变量。
除非你的对象是单例的或不变的,否则尽可能少地声明static变量。
九、各类引用
java.lang.ref.Reference有几个子类,用于处理和GC相关的引用。JVM的引用类型简单来说有几种:
· Strong Reference,最常见的引用
· Weak Reference,当没有指向它的强引用时会被GC回收
· Soft Reference,只当临近OOM时才会被GC回收
· Phantom Reference,主要用于识别对象被GC的时机,通常用于做一些清理工作
当你需要实现一个缓存时,可以考虑优先使用WeakHashMap,而不是HashMap,当然,更好的选择是使用框架,例如Guava Cache。
最后,再次提醒,以上的这些未必可以对代码有多少性能上的提升,但是熟悉这些方法,是为了帮助我们写出更卓越的代码,和GC更好地合作。
Written by Hesey Wang in: , |JAVA 编程资料牛鼻站
站内搜索: 请输入搜索关键词
 牛鼻?Java 热门图书
本书为英文第三版。Thinking in Java begins a little esoterically, wit……
 牛鼻?论坛热门的讨论
 牛鼻?Java 类编程图书
- 作者: Bruce Eckel
- 作者: Bruce Eckel
- 作者: Bruce Eckel
- 作者: Bruce Eckel,翻译: Trans Bot
- 作者: David J. Eck
- 作者: James Gosling,Bill Joy,Guy Steel
 牛鼻?在线帮助文档
- 作者: Sun Microsystems, Inc.
- 作者: Sun Microsystems, Inc.
- 作者: Sun Microsystems, Inc.
- 作者: Sun Microsystems, Inc.
- 作者: Sun Microsystems, Inc.
- 作者: Sun Microsystems, Inc.
 牛鼻?开发资料
首页最后更新时间: 12:44:41java程序设计(吴萍蒲鹏朱丽娟编清华大学出版社教材)_百度百科
?吴萍蒲鹏朱丽娟编清华大学出版社教材
java程序设计
(吴萍蒲鹏朱丽娟编清华大学出版社教材)
《java程序设计》是2006年清华大学出版社 出版的图书,作者是、蒲鹏、。主要讲述了本书通过对Java编程语言的全面介绍,引导读者快速地掌握Java编程语言的核心内容并学会灵活运用所学的语言知识及的编程思想。全书共分9章,内容包括概述、初步、的基本语法、类库与数组、面向对象编程深入、程序、编程、和输入输出及多线程编程。
作者: 、蒲鹏、编著
印刷时间: 次印刷
定价:19 .00
本书适合作为高等学校Java程序设计课程教材,尤其是适用于非计算机专业的学生,也适用于作为相关的培训和自学教材。
第1章 Java概述
1?1 Java的产生与发展
1?2 的特点
1?3 Java语言平台及相关应用
1?3?1 Java 2标准版本——J2SE
1?3?2 Java 2企业版本——J2EE
1?3?3 Java 2微型版本——J2ME
第2章 Java编程概述
2?1 JDK的安装与配置
2?2 Java环境的建立
2?3 Java应用程序实例
2?3?1 Java应用程序的编辑
2?3?2 Java应用程序的编译和运行
2?4 Java Applet实例
2?4?1 Java Applet的编辑与编译
2?4?2 的编辑与运行
第3章 Java基本语法结构
3?1 标识符
3?1?1 自定义标识符
3?1?2 关键字
3?1?3 类库中的标识符
3?2?1 空白符
3?2?2 普通分隔符
3?3?2 多行注释
3?3?3 文档注释
3?4 基本数据类型
3?4?1 整数类型
3?4?2 浮点类型
3?4?3 字符类型
3?4?4 布尔类型
3?4?5 数据类型的相互转换
3?5?1 常量
3?5?2 变量
3?6 运算符与表达式
3?6?4 逻辑运算符
3?6?6 其他运算符
3?6?7 运算符的
3?7?1 数组的创建
3?7?2 数组的使用
3?8 Java语句
3?8?4 复合语句
3?9?1 条件语句
3?9?3 转移语句
第4章 类与
4?1 面向对象编程基础
4?1?1 面向对象编程的基本概念
4?1?2 面向对象编程的优点
4?1?3 对象的抽象
4?1?4 封装
4?2 类的编程实现
4?2?1 类定义
4?2?2 域的定义
4?2?3 方法的定义
4?2?4 main()方法
4?3 对象的定义与使用
4?3?1 对象的创建
4?3?3 对象的使用
4?4?1 方法的重载
4?4?2 构造方法的重载
4?4?3 关键字this的应用
4?5?1 public修饰符
4?5?2 private修饰符
4?5?3 protected修饰符
4?5?4 默认的修饰符
4?6 其他修饰符
4?6?1 static修饰符
4?6?2 final修饰符
第5章 类间的关系
5?1 类与类之间的关系
5?1?1 使用关系
5?1?2 包含关系
5?1?3 继承关系
5?2 类的继承
5?2?1 继承的基本概念
5?2?2 子类的创建和使用
5?2?3 域的隐藏
5?2?4 方法的覆盖
5?2?5 super关键字
5?2?6 之间的
5?3?1 抽象类
5?3?2 抽象方法
5?4?1 接口的定义
5?4?2 接口的实现
5?5?1 包的创建
5?5?2 包的引用
第6章 Java基本类库
6?1 Java类库
6?1?1 Java类库的分类
6?1?2 Java类库的使用
6?1?3 Java文档的使用
6?2 Object类与System类
6?2?1 Object类
6?2?2 System类
6?3?1 String类
6?3?2 StringBuffer类
6?4 Java类型包装类
6?5 Math类
6?6 Exception类
6?6?1 Java中的异常类
6?6?2 异常的使用与处理
6?7 Vector类
6?7?1 Vector类的基本方法
6?7?2 数据插入与访问方法
6?7?3 修改和删除数据方法
6?7?4 数据的查找方法
第7章 Java Applet
7?1 Applet 概述
7?2 一个小程序开发的技巧
7?3 Applet类
7?3?1 Applet类中主要方法和Applet生命周期
7?3?2 什么是JApplet
7?3?3 Applet的运行机制
7?3?4 与Applet之间的参数传递
7?4 Applet的应用举例
7?4?1 实例1:鼠标事件
7?4?2 实例2:加载图像
第8章 图形用户接口设计
8?1 Swing简介
8?1?1 AWT和Swing概述
8?1?2 Swing
8?2 Swing组件与容器
8?2?1 Swing组件概述
8?2?2 顶层容器
8?3 标签与按钮
8?3?1 标签
8?3?2 按钮
8?4 事件与文本输入
8?4?1 事件处理
8?5?1 复选框
8?5?2 单选按钮
8?6 GUI布局管理器
8?6?1 基本布局管理器
8?6?2 面板
8?6?3 高级布局管理器
8?7?1 组合框
8?7?2 列表框
8?8 其他组件
8?8?1 和滑动块
8?8?2 Swing对话框
8?8?3 菜单
第9章 输入输出流与文件
9?1 输入输出流简介
9?2 字节输入输出流
9?2?1 字节
9?2?2 字节输出流
9?3 字符输入输出流
9?3?1 字符输入流
9?3?2 字符输出流
9?4 文件的创建与访问
9?4?1 File类
9?4?2 输入输出文件流
9?4?3 随机读写文件流的输入输出
9?4?4 文件流的功能扩展
9?5 标准输入输出流
第10章 多线程
10?1 的相关概念
10?1?1 程序、进程与线程
10?1?2 多线程
10?2 线程的生命周期
10?3 Java中多线程的实现
10?3?1 Thread类
10?3?2 Runnable接口
10?4 线程的同步
10?4?1 同步方法
10?4?2 同步语句
10?5 线程的调度
10?5?1 线程的调度
10?5?2 的管理
10?6 多线程之间的通信
10?6?1 线程之间的通信问题
10?6?2 线程之间的通信解决方法
第11章 网络通信程序设计
11?1 网络通信基础
11?1?2 TCP和传输协议
11?1?3 客户-服务器编程模型
11?2 Java网络包
11?3 InetAddress类
11?4 的Socket网络通信
11?4?1 Socket类
11?4?2 ServerSocket类
11?4?3 面向连接Socket的一个具体应用
11?4?4 支持多客户的服务器的设计
11?5 基于Socket的网络通信
11?5?1 DatagramPacket类
11?5?2 DatagramSocket类
11?5?3 基于数据报Socket的通信实现
11?6 访问URL资源
11?6?1 URL类
11?6?2 URLConnection类
第12章 数据库与编程
12?1 JDBC概述
12?2 JDBC驱动程序的类型
12?3 JDBC URL
12?4 JDBC中主要的类和接口
12?4?1 JDBC驱动设置类DriverManager
12?4?2 连接接口Connection
12?4?3 语句接口Statement
12?4?4 对象ResultSet
12?4?5 PreparedStatement接口
12?4?6 CallableStatement接口
12?5 JDBC本地驱动连接SQLServer2000数据库
12?6 综合范例
-----------------

我要回帖

更多关于 java 的文章

 

随机推荐