改善Java应用程序性能的快速技巧

曾经遇到过性能问题吗? 我也是。 如果我的经理再喊一次“ faaaaster”,我一生都会有听力障碍。 顺便说一句,我能听到所有声音中的德语发音吗? ;-)

您可以相信仍然有人无知地在谈论垃圾收集器(得到它吗?)和JVM的性能。

……我将再次返回C语言,因此我不必担心性能……

*叹*

JVM一直在不断改进其收集器算法,并且每个发行版中都将高度复杂的优化功能集成到了编译器中(并且最近十年来一直在这样做)。 您是否真的希望比世界上一些最聪明的人有经验,能力和时间来编写更好,更优化的C代码?

Pleeeeease…

如果您像我一样,其余99.99%的人,则明智的做法是忘记C。克服它。 (向所有核心C程序员致敬,不要被激怒)。

尽管我们的开发人员喜欢抽象,但我们不能否认它们天生就是泄漏的事实。 硬件*确实*很重要。 处理器数量和内存增长的趋势使共享内存线程并发变得更加困难。 锁定 ,上下文切换和线程调度可以使您的吞吐量等于糖浆,认为将更多线程倒入闪亮的新超级美容机中将以某种方式神奇地为您提供更多性能。 在某种程度上可能会,但这不是我的意思。

那么该怎么办? 我并没有声称自己是一名性能专家,但我不是,但我有一些实用建议,至少可以帮助我解决过去一些讨厌的性能错误。

1.编写简洁明了的代码。 考虑使您的类不可变,它们是线程安全的,因此不需要同步,并且可以放心地对其进行缓存,以确保对象值在创建后不会更改。 不变性还导致代码更易于理解。 不要尝试使用过早的优化技巧来超越JVM。

Donald Knuth说: “程序员浪费大量时间来考虑或担心程序非关键部分的速度,而这些效率的尝试实际上在考虑调试和维护时会产生严重的负面影响。 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。 但是我们不应该放弃我们那关键的3%的机会。”

2.花一些时间了解不同垃圾收集器的工作方式。 信息有点分散,但是它在那里。 找到垃圾回收和您的应用程序之间的资源共享最有效点。 一般来说,较大的堆意味着垃圾收集器需要更努力地工作(窃取更多的CPU周期),并且暂停时间会更长,但频率更低。 以我的经验,即使使用CMS也无法避免世界停顿,因为最终您的堆将像瑞士奶酪一样碎片化,并且繁荣, 内存碎片化失败 。 好消息是,JDK7可能会包括一个名为G1的新的低暂停时间收集器,该收集器有可能完全避免世界停顿。 另请参阅Java 7中的垃圾优先收集器(G1) 。

3.在编程时,默认情况下始终使用java.util.concurrency 。 阅读Java内存模型和线程规范 。 它将帮助您理解为什么您的代码可能无法正常运行。 关于并发的主题也有很多不错的书:

  • 实践中的Java并发
  • 多处理器编程的艺术
  • Java并发编程:设计原理和模式(第二版)

4.您可能正在处理具有粗糙粒度同步的旧代码(您无法影响),从而导致高线程争用。 将CPU亲和力与同一台机器上的多个JVM进程一起使用可以帮助减少对热锁的争用。

5.如果您认为通过执行基准测试发现JVM性能问题,请首先确保您“知道”测量结果是准确的 。 如果您尝试测量某些东西, 请不要测量其他东西 。 忽略此建议可能会使您误以为是真正的问题所在。 因此,在开始测量之前,请确保正确隔离系统部件。

例如,如果您怀疑线程争用,请查看ThreadInfo或尝试jstat并查找sun.rt._sync_ContendedLockAttempts。

jstat -J-Djstat.showUnsupported=true -snap PID | grep _sync_

关于这个主题有太多话要说,但是我现在没有时间写更多。 编码愉快!

参考: Deep Hacks博客上的JCG合作伙伴 Usain Bolt看起来 不错 。

相关文章 :

  • Java最佳实践
  • 如何在Java中获得类似于C的性能
  • 每个程序员应该了解的内存系统知识
  • Java内存模型–快速概述和注意事项

翻译自: https://www.javacodegeeks.com/2011/09/quick-tips-for-improving-java-apps.html

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

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

相关文章

P1047 [NOIP2005 普及组] 校门外的树

某校大门外长度为 ll 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 ll 的位置;数轴上的每个整数点,即 0,1,2,\dots,l0,1,2,…,l&#xff0…

团队开发——个人工作总结04

昨天对要用到的SQL语句进行了研究,分别得到了以下结果: 1.这段语句是为用户登录服务的,通过JSP的到的用户名username和密码passdword作为条件查询数据库,如果有查询结果,则返回true select * from [login] where usern…

Nginx的几种常见的几种启动方式

1.默认方式启动 直接执行Nginx的二进制文件即可 /usr/local/nginx/sbin/nginx 这时默认读取配置文件,配置文件目录 /usr/local/nginx/conf/nginx.conf 2.指定配置文件的启动方式 /usr/local/nginx/sbin/nginx -c /tmp/nginx.conf转载于:https://www.cnblogs.com/Leo…

yii2阅读随笔14

继续来看Event.php /*** Triggers a class-level event.* 触发类级别事件。* This method will cause invocation of event handlers that are attached to the named event* for the specified class and all its parent classes.* 触发某个类或者对象的某个事件* param strin…

P1059 [NOIP2006 普及组] 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学…

基本的EJB参考,注入和查找

在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v。3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将它们连接起来。 在此博客文章中,我们将研究一些基本示例以了解如何使用EJB API…

ViewPager使用笔记

1.ViewPager.setCurrentItem(position),即使已设置动画,但是没有动画效果 原因:因为ViewPager滑动之前的时间间隔太短,可以通过反射,去修改ViewPager自动滑动时间,代码实现如下 1 public class ViewPagerSc…

IOS开发之Swift学习笔记

1.因为存储属性要求初始化,我们可以使用lazy修饰符来延迟初始化。转载于:https://www.cnblogs.com/luntai/p/5430223.html

力扣1两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

C ++或Java,高频交易哪个更快?

总览 关于什么是高频交易的最佳解决方案,存在不同意见。 问题的一部分是高频交易的变化超出您的预期,另一部分是更快的含义。 我的看法 如果您有一个典型的Java程序员和一个典型的C 程序员,并且每个人都有几年编写典型的面向对象程序的经验…

iOS 8 Xcode6 设置Launch Image 启动图片

本人apem http://www.mamicode.com/info-detail-494411.html 如何设置App的启动图,也就是Launch Image? Step1 1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image"2.如图,右侧的勾选可以让你选择是否要对ipad,横屏,竖屏,以及低版本的ios系统做支持…

代码分享h5-sessionStorage,提示app下载代码块

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF负载平衡和故障转移

前一段时间&#xff0c;我们已经面临基于Apache CXF的负载平衡Web服务客户端的需求。 此外&#xff0c;当某些服务器关闭时&#xff0c;客户端应自动进行故障转移。 更糟糕的是&#xff0c;服务器目标地址列表要从外部服务获取并在运行时更新。 最终&#xff0c;我们最终获得了…

Java局部变量一定要赋初值

根据大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而写的 1.类成员变量在 类加载 时会被系统赋初值&#xff0c;比如定义一个整型变量int num 系统默认num值为0 2.但是方法内的局部变量执行进栈操作&#xff0c;这个过程中系统不会赋初值&…

隐式的类类型转换

如果构造函数只接受一个实参&#xff0c;则它实际上定义了转换为此类类型的隐式转换机制。将这种构造函数称为转换构造函数。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

负数的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等语言中意为 求余 &#xff0c;在python 中意为 取模 3.a%b c 求余: c的符号和a一致 取模&#xff1a;c的符号和b一致 比如&#xff0c;一个小李子&#xff1a; public class Solution{public static void main(String…

PAT-BASIC-1038-统计同成绩学生

本题要求读入N名学生的成绩&#xff0c;将获得某一给定分数的学生人数输出。 输入格式&#xff1a; 输入在第1行给出不超过105的正整数N&#xff0c;即学生总人数。随后1行给出N名学生的百分制整数成绩&#xff0c;中间以空格分隔。最后1行给出要查询的分数个数K&#xff08;不…

JavaScript事件处理的三种方式(转)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript应用跳动的心脏&#xff0c;也是把所有东西粘在一起的胶水&#xff0c;当我们与浏览器中Web页面进行某些类型的交互时&#xff0c;事件就发生了。 事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键…

Erlang与Java内存架构

我读了一篇关于Erlang VM的内存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰写的论文 &#xff0c;我认为讨论Erlang的内存设置和Oracle的Java VM之间的差异可能会很好。 作为对从未听说过Erlang的人的真正的简短介绍; 它是一种功能语言&#xff0c;使用异步消息传…

Xuggler教程:转码和媒体修改

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 在之前的教程中&#xff0c;我对视频处理Xuggler进行了简短介绍 。 在这一部分中&#xff0c;我们将看到Xuggler和FFmpeg提供的一些更令人兴奋的功能&#xff0c;例如视频转码和媒体修改。 不要忘记Xuggler是一…