java学习-如何用Java进行高性能网站开发

news/2024/5/20 4:45:33/文章来源:https://blog.csdn.net/weixin_34378045/article/details/90583189

1、生成对象时,合理分配空间和大小:

Java中的很多类都有它的默认的空间分配大小,对于一些有大小的对象的初始化,应该预计对象的大小,然后使用进行初始化。

例如:我们在使用Vector,当声明Vector vect=new Vector()时,系统调用:

public Vector() {// 缺省构造函数

this(10); // 容量是 10;

}

缺省分配10个对象大小容量。当执行add方法时,可以看到具体实现为:..

public synchronized boolean add(Object o) {

modCount++;

ensureCapacityHelper(elementCount+1);

elementData[elementCount++] =o;

return true;

}

private void ensureCapacityHelper(int minCapacity) {

int oldCapacity = elementData.length;

if (minCapacity > oldCapacity) {

Object oldData[] = elementData;

int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) :

(oldCapacity * 2);

if (newCapacity < minCapacity) {

newCapacity = minCapacity;

}

elementData = new Object[newCapacity];

System.arraycopy(oldData, 0, elementData, 0, elementCount);

}

}

我们可以看到,当Vector大小超过原来的大小时,一些代码的目的就是为了做容量的扩充,在预先知道该Vector大小的话,可以指定其大小,避免容量扩充的开销。

如果想学习Java可以来这个群,首先是一二六,中间是五三四,最后是五一九,里面有大量的学习资料可以下载。

2、优化循环体:

循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。让我们看看下面的代码片:..

Vector vect = new Vector(1000);

...

for( inti=0; i<vect.size(); i++){

...

}

for循环部分改写成:

int size = vect.size();

for( int i=0; i>size; i++){

...

}

如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。

再看如下的代码片:..

for (int i = 0;i <100000;i++)

if (i%10 == 9) {

... // 每十次执行一次

}

改写成也可以提高效率:..

for(inti =0,j =10; i<100000; i++,j--){

if(j == 0){

... // 每十次执行一次

j = 10;

}

}

所以,当有较大的循环时,应该检查循环内是否有效率不高的地方,寻找更优的方案加以改进。

3、少用new初始化一个实例:

尽量少用new来初始化一个类的实例,当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。

当new创建对象不可避免时,注意避免多次的使用new初始化一个对象。

尽量在使用时再创建该对象。如:

NewObject object = new NewObject();

int value;

if(i>0 )

{

value =object.getValue();

}

上面一段代码可以修改为:

int value;

if(i>0 )

{

NewObject object = new NewObject();

Value =object.getValue();

}

另外,应该尽量重复使用一个对象,而不是声明新的同类对象。一个重用对象的方法是改变对象的值,如可以通过setValue之类的方法改变对象的变量达到重用的目的。

4、选择合适的方法调用:

在Java中,一切都是对象,如果有方法(Method)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。

可以减少方法的调用,同样一个方法:

public void CallMethod(int i ){

if( i ==0 ){

return;

}

... // 其他处理

}

如果直接调用,

int i = 0;

...

CallMethod(i);

上面的代码,就应该写成:

int i = 0;

...

if( i ==0 ){

CallMethod(i);

}

不影响可读性等情况下,可以把几个小的方法合成一个大的方法。

另外,在方法前加上final,private关键字有利于编译器的优化。

5、异常处理技巧:

异常是Java的一种错误处理机制,对程序来说是非常有用的,但是异常对性能不利。抛出异常首先要创建一个新的对象,并进行相关的处理,造成系统的开销,所以异常应该用在错误处理的情况,不应该用来控制程序流程,流程尽量用while,if等处理。

在不是很影响代码健壮性的前提下,可以把几个try/catch块合成一个。

如果想学习Java可以来这个群,首先是一二六,中间是五三四,最后是五一九,里面有大量的学习资料可以下载。

6、尽量使用局部变量和静态变量:

尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack) 中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

尽量使用静态变量,即加修饰符static,如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。

7、同步处理技巧:

同步主要出现在多线程的情况,为多线程同时运行时提供对象数据安全的机制,多线程是比较复杂话题,应用多线程也是为了获得性能的提升,应该尽可能减少同步。

另外,如果需要同步的地方,可以减少同步的代码段,如只同步某个方法或函数,而不是整个代码。

8、尽可能的使用Java自身提供的API:

Java的API一般都做了性能的考虑,如果完成相同的功能,优先使用API而不是自己写的代码,如数组复制通常的代码如下:

int size = 1000;

String[] strArray1 = new String[size];

String[] strArray2 = new String[size];

for(inti=0;i<size;i++){ // 赋值

strArray1 = (new String("Array: " + i));

}

for(inti=0;i<size;i++){ // 复制

strArray2=(new String((String)a));

}

上面那段代码,如果使用Java提供的API,就可以提高性能:

int size = 1000;

String[] strArray1 = new String[size];

String[] strArray2 = new String[size];

for(inti=0;i<size;i++){ // 赋值

strArray1 = (new String("Array: " + i));

}

System.arraycopy(strArray1,0,strArray2,0,size); // 复制

同样的一个规则是,当有大量数据的复制时,应该使用System.arraycopy()。

9、尽量减少I/O操作:

输入/输出(I/O)包括很多方面,我们知道,进行I/O操作是很消耗系统资源的。程序中应该尽量少用I/O操作。使用时可以注意: . 合理控制输出函数System.out.println()对于大多时候是有用的,特别是系统调试的时候,但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。

特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个Debug的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。

10、尽量使用缓存:

读写内存要比读写硬盘上的文件要快很多,应尽可能使用缓冲,以便直接从内存中读取数据。

尽可能使用带有Buffer的类代替没有Buffer的类,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer来进行处理I/O操作。

同样可以用BufferedInputStream代替InputStream都可以获得性能的提高

11、尽量不使用同步:

Servlet是多线程的,以处理不同的请求,基于前面同步的分析,如果有太多的同步就失去了多线程的优势了。

12、不用保存太多的信息在HttpSession中

很多时候,存储一些对象在HttpSession中是有必要的,可以加快系统的开发,如网上商店系统会把购物车信息保存在该用户的Session中,但当存储大量的信息或是大的对象在会话中时,是有害的,特别是当系统中用户的访问量很大,对内存的需求就会很高。

具体开发时,在这两者之间应作好权衡。

13、清除SESSION

通常情况,当达到设定的超时时间时,同时有些Session没有了活动,服务器会释放这些没有活动的Session,.. 不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效Session。

当用户退出时,应该手动释放,回收资源,实现如下:..

HttpSession theSession = request.getSession();

// 获取当前Session

if(theSession != null){

theSession.invalidate(); // 使该Session失效

}

14、缓存Home接口

EJB库使用Enterprise Bean 的客户端通过它的Home接口创建它的实例。客户端能通过JNDI访问它。服务器通过Lookup方法来获取。

JNDI是个远程对象,通过RMI方式调用,对它的访问往往是比较费时的。所以,在设计时可以设计一个类专门用来缓存Home接口,在系统初始化时就获得需要的Home接口并缓存,以后的引用只要引用缓存即可。

15、使用快速度的Jdbc驱动

JDBC API包括两种实现接口形式,一种是纯Java实现的驱动,一种利用ODBC驱动和数据库客户端实现,具体有四种驱动模式:

第一类:JDBC-ODBC桥,再加上ODBC驱动程序。

第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。建议第一类驱动程序只用于原型开发,而不要用于正式的运行环境。桥接驱动程序由Sun提供,它的目标是支持传统的数据库系统。Sun为该软件提供关键问题的补丁,但不为该软件的最终用户提供支持。一般地,桥接驱动程序用于已经在ODBC技术上投资的情形,例如已经投资了Windows应用服务器。

尽管Sun提供了JDBC-ODBC桥接驱动程序,但由于ODBC会在客户端装载二进制代码和数据库客户端代码,这种技术不适用于高事务性的环境。另外,第一类JDBC驱动程序不支持完整的Java命令集,而是局限于ODBC驱动程序的功能,这种驱动方式也叫胖客户,主要用于低并发请求,大数据量传输的应用。

第二类:本机API,部分是Java的驱动程序。

第二类JDBC驱动程序是本机API的部分Java代码的驱动程序,用于把JDBC调用转换成主流数据库API的本机调用。这类驱动程序也存在与第一类驱动程序一样的性能问题,即客户端载入二进制代码的问题,而且它们被绑定了特定的平台。

第二类驱动程序要求编写面向特定平台的代码,主流的数据库厂商,例如Oracle和IBM,都为它们的企业数据库平台提供了第二类驱动程序,使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。

另外,由于第二类驱动程序没有使用纯Java的API,把Java应用连接到数据源时,往往必须执行一些额外的配置工作。很多时候,第二类驱动程序不能在体系结构上与大型主机的数据源兼容;即使做到了兼容,效果也是比较差。

第一类和第二类驱动的比较

java学习-如何用Java进行高性能网站开发

第一类和第二类驱动的比较

第三类:面向数据库中间件的纯Java驱动程序

第三类JDBC驱动程序是面向数据库中间件的纯Java驱动程序,JDBC调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到数据库API。第三类JDBC驱动程序的优点是它以服务器为基础,也就是不再需要客户端的本机代码,这使第三类驱动程序要比第一、二两类快。另外,开发者还可以利用单一的驱动程序连接到多种数据库。

第四类:直接面向数据库的纯Java驱动程序。

第四类JDBC驱动程序是直接面向数据库的纯Java驱动程序,即所谓的“瘦”(thin)驱动程序,它把JDBC调用转换成某种直接可被DBMS使用的网络协议,这样,客户机和应用服务器可以直接调用DBMS服务器。对于第四类驱动程序,不同DBMS的驱动程序不同。因此,在一个异构计算环境中,驱动程序的数量可能会比较多。但是,由于第四类驱动程序具有较高的性能,能够直接访问DBMS,所以这一问题就不那么突出了, 这种驱动方式,主要用于高并发,低数据量请求的应用中。

第三类和第四类驱动的比较

java学习-如何用Java进行高性能网站开发

第三类和第四类驱动的比较

为了提高访问数据库的性能,我们还可以使用JDBC 2.0的一些规范和特性,JDBC是占用资源的,在使用数据库连接时可以使用连接池Connection Pooling,避免频繁打开、关闭Connection。而我们知道,获取Connection是比较消耗系统资源的。

Connection缓冲池:当一个应用程序关闭一个数据库连接时,这个连接并不真正释放而是被循环利用,建立连接是消耗较大的操作,循环利用连接可以显著的提高性能,因为可以减少新连接的建立。

一个通过DataSource获取缓冲池获得连接,并连接到一个CustomerDB数据源的代码演示如下:

Context ctx = new InitialContext();

DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");

Connection conn = dataSource.getConnection("password","username");

16、缓存DataSorce

一个DataSource对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件,完全依赖于它是怎样实现的,一个数据源对象注册到JNDI名字服务后,应用程序就可以从JNDI服务器上取得该对象,并使用之和数据源建立连接。

通过上面的例子,我们知道DataSource是从连接池获得连接的一种方式,通过JNDI方式获得,是占用资源的。

为了避免再次的JNDI调用,可以系统中缓存要使用的DataSource。

及时关闭使用过的资源

互联网应用系统一般是并发的系统,在每次申请和使用完资源后,应该释放供别人使用,使用完成后应该保证彻底的释放。

17、架构选型

在网站Web应用开发中,系统的整体架构是决定网站性能、稳定性、并发、可扩展性的关键因素。下面以世界著名网站应用软件提供商CoreMediaCMS系统为例,进行架构分析

java学习-如何用Java进行高性能网站开发

CoreMediaCMS将整个应用分成四成架构,每一层都可以独立于其他层而正常运行,每一层都可以分布式布署,极大的提高了应用系统的稳定性、可扩展性、支持高并发的要求,每一次之前通过中间件Corba进行稳定的传输数据。

18、开发框架的选型

充分利用开源框架,可以大大提高开发效率。很多初级开发者,都采用DB+JavaBean+JSP这种初级的开发模式,而现在主要使用Struts、Spring等MVC开发框架。

常用开发框架构选型有:

Struts、Spring、Webwork等。

我们选择的开发框架是:Spring+Hibernate+Spring MVC,在这个开发框架里,充分利用了Hibernate、Spring各自己的优点,可以选择Struts,也可以选择Spring MVC。

如果想学习Java可以来这个群,首先是一二六,中间是五三四,最后是五一九,里面有大量的学习资料可以下载。

19、分级存储

1)数据库数据分级存储:

将经常访问的数据和访问频度低的数据,分别存放到不同的分区,甚至存放到不同的数据库服务器,以便合进分配硬盘I/O及系统I/O。

2)网站内容发布之后,分级存储:

任何一个大型的网站,一般都有海量的内容,为了提高访问效率,应搭建分级存储体系,根据应用的重要性和访问并发要求,将这些内容分级存储,同时将静态内容中的静态页面文件、图片文件、下载文件分不同的Web服务器访问,降低I/O争用,提高访问效率,同时让数据存储、管理、备份更加清晰。

20、页面静态化

一个大型网站,既有静态内容,也有动态内容。静态内容,直接通过Apache或者Squid访问,效率高,稳定可靠,更多的是受服务器等硬件设备的I/O吞吐量、网络环境及页面代码本身质量限制,不受应用系统及数据库性能限制,这些内容往往访问速度和效率不会有较大的问题。

而动态内容,除了受硬件设备I/O、操作系统I/O及内容、网络环境及页面代码的影响,还要受应用服务器和数据库性能影响,因此,这部份内容,要尽可能作静态化或者伪静态,并采用缓存技术,将其缓存,以减少对应用服务器和数据库服务器的操作次数,提高用户访问效率和稳定性。

21、缓存策略

对于构建的业务系统,如果有些数据要经常要从数据库中读取,同时,这些数据又不经常变化,这些数据就可以在系统中缓存起来,使用时直接读取缓存,而不用频繁的访问数据库读取数据。

缓存工作可以在系统初始化时一次性读取数据,特别是一些只读的数据,当数据更新时更新数据库内容,同时更新缓存的数据值。

例如:在天极CMS2005系统中,我们将很少发生变化的网站节点树数据,缓存在客户端,当用户登录时,一次性读入到客户端缓存起来,以后编辑在使用时,不用再从数据库中读取,大大提高了应用系统的访问速度。

当然,也可以将数据库中重复访问的数据缓存在应用服务器内存中,减少对数据库的访问次数,Java常用的缓存技术产品有:MemoryCache、OSCache等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_808192.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一次发布网站需要注意的地方备忘

点击服务器,然后双击ISAPI和CGI限制。 点击应用程序池,选择该网站的应用程序池,然后右键-->高级设置,选择标识为LocalSystem 添加网站: 编辑网站文件夹权限和sql server数据库权限。 浏览器可以查看到错误代码的方法…

企业网站为什么要考虑SEO优化?

这里的“SEO”是指让网站更容易被搜索引擎所接受,一般搜索引擎会在浏览器上抓取一些更新的信息,从中筛选对比是否有重复、有价值,然后再由浏览器将这些信息以最快的速度呈现给搜索者,作为一家B2B商务网站公司,下面德客…

ThinkSNS官方网站全新上线,欢迎体验!

2019独角兽企业重金招聘Python工程师标准>>> 新官网新增了ThinkSNS产品介绍页面、定制开发业务介绍页面,同时将所有TS系列产品下载体验集中放置,增加源码下载单元,资讯内新增版本发布、优惠活动等类别,让你第一时间就能…

爬取三个acm网站题库(neuqoj pku hdu)

环境:macosPython3.9(Windows版本仅需更改目录) 效果图: 代码: 没有写多线程,按需更改range()或者多个文件一起运行。 1.neuqoj import requests from bs4 import BeautifulSoup…

宝塔面板CPU占满100%,负载100%网站缓慢解决方法

宝塔面板CPU占满100%,负载100%网站缓慢解决方法 15 7月 宝塔服务器面板cpu、负载都是100%,让我给解决,说起来很蒙,一般来说这种问题的可能性很多,有可能是程序性能、服务器负载能力、并发访问、木马病毒、被植入了挖矿…

通过ISA/TMG访问地图网站时提示Stack overflow at line:0

前两天网上看到不少网友在讨论访问在ISA/TMG环境下,访咩map.baidu.com页面,页面会提示如下报错信息:我自己也研究了,通过这个报错,第一感觉应该不是网站本身的错误,而很有可能是通过防火墙时策略被阻止了&a…

构建自己的NFTmint网站

构建自己的NFTmint网站 实现在前端页面进行NFT的mint出售 提供了一种将现有 NFT 智能合约链接到dapp 的简便方法。 可以方便的进行二次修改 大家都知道NFT可以从二级市场像Opensea等购买 但其实想要最快、最直接的购买NFT就必须在发售的时候 到项目的官方网站或是智能合约…

bilibili网站视频教程推荐整理-2019.9.15

我的收藏: 自己搜素整理的资源,包括各种算法讲解,教程合集等等。 https://space.bilibili.com/472387717/favlist 一、经典算法、Linux、python等视频合集 算法以画图的形式来讲解,清晰易懂,是我接触的最好的教程之一…

网站收录提交入口

对于刚刚写好的博客来说,一般情况下是不会被搜索到的,这是因为各大搜索引擎还未收录该博客,那么怎么才能被百度、google、bing等各大搜索引擎收录你的博客呢?这就需要你去主动提交你的博客地址。接下来分享几个搜索引擎的提交地址…

HTTP 错误 500.22 - Internal Server Error—IIS7 Asp.net2.0 网站运行失败解决办法

Technorati 标签: HTTP500,IIS7,Godaddy今天在使用Godaddy.com的windows主机时,出现了以下错误: Error Summary HTTP Error 500.22 - Internal Server Error An ASP.NET setting has been detected that does not apply in Integrated managed pipeline …

网站互点排名掉了网站互点排名掉了网站互点_解析网站不收录的各大原因

每当百度新算法上线,都会有很多网站被百度降权,有的网站直接被K掉,有的网站排名下降,SEO的不确定因素很多,比如说网站的排名并不是做上去就能保证不掉下来的,由于各种因素,网站的排名会上下波动…

datagridview cell字体大小自适应_自适应网站页面适配实现和基本原理讲解

随移动端设备的普及,移动web网站成为了前端工程师工作主攻点诸多的手机厂商,导致每种手机机型、分辨率等手机参数相差很多,同时给前端开发人员增加了工作难度此时手机端的适配是个不得不解决的问题下面介绍一下网站适配的实现及原理是如何操作…

Bootstrap Studio for Mac(网站设计制作工具)

Bootstrap Studio for Mac是一款网站设计制作工具,它带有大量内置组件,您可以拖放以组装响应式网页,功能强大!使用Bootstrap Studio Mac版,帮助你快速地创建一个外观漂亮且运行良好的网站。 bootstrap studio mac版软件…

dataframe 如何增加新的索引_网站运营优化:新网站如何增加收录

最近傲马创新思维培训老师发现好多人都在问为什么自己的网站收录率这么低,尤其是一些新网站,这是为什么呢?今天就和大家聊一聊网站收录那些事儿!新网站除了网站权重较低导致收录率低外,还有一点就是蜘蛛没有爬行你的网…

Coherence X for mac(网站转换为mac应用的工具)

Coherence X是一款网站转换为mac应用的工具,可让您将任何网站转换为Mac上基于铬的本机应用程序,支持大多数文件类型。 Coherence X软件介绍 Mac上的网站和应用之间的完美中间地带 Coherence X可让您将任何网站转换为Mac上基于铬的本机应用程序。 与E…

WebScraper for Mac(网站数据抓取工具)

WebScraper for Mac是为Mac系统而设计的网站数据抓取工具,使用Web Scraper,您可以构建将导航站点并提取数据的站点地图,Scraper还可以提取使用JavaScript动态加载或生成的数据等,使用webscraper mac版可以快速提取与特定网页相关的…

Unite for Mac(将网站转化为应用程序)

Unite Mac版是一款可以将任意网站转换成Mac原生应用程序的软件,支持状态栏,通知、jd 载入等自定义功能,并且可以将其分发给别人使用。 软件介绍 Unite允许您将网站转换为Mac上的本机应用程序。Unite使体验更加完美,全新的设计&am…

linux 分析系统配置,Services - CentOS 7系统配置上的变化解析_Linux教程_Linux公社-Linux系统门户网站...

二、Services[rootlocalhost ~]# chkconfigNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use systemctl li…

攻防世界杂项(misc)--新手练习区(详解十二道题完结,附件做题过程中使用到的各种工具和网站)

攻防世界杂项(misc)–新手练习区(详解) 第一题:this_is_flag 题目描述:Most flags are in the form flag{xxx}, for example:flag{th1s_!s_a_d4m0_4la9} 根据题目描述确定flag为:flag{th1s_!s_a_d4m0_4la9} 第二题…

Linux服务器无法写入,linux下写入文件失败_网站服务器运行维护,linux,写入,文件,失败...

配置Apache服务器的默认首页_网站服务器运行维护访问Apache服务器时,默认是直接访问htdocs目录下的index.html,这是在conf/httpd.conf中配置的。​访问Apache服务器时,它默认的从这里找文件,先找index.php,再找index.h…