2

java判断操作系统(JAVA属于操作系统吗)

看你业务系统做得是否完善。一般财务系统会有一个作废发票库,里面有作废时间和作废原因,需要对现有发票做转库操作。同时对作废发票所对应的报销单状态进行判断,如未通过最终审批,则需要打回报销人。企业我很少有改状态的事,改状态直接改属性好了根本不用做方法。作废是个动词,不是发票是否作废的属性。#程序# #程序员# #Java#

博士聊IT

现在的程序员已经不会用面向对象的方法了。拿着面向对象工具,写着面向过程的程序。很多程序员从来不用继承关系,这里面既有没弄清楚面向对象的基本理论,包括面向对象和人类自然语言的关系,也有使用了开发框架有所限制的问题。例如企业做报销系统,发票有打车票、餐饮票、火车票、飞机票和住宿票等等,发票有共同的属性,如开票单位,开票时间,开票金额。但每一种票都不一样的属性,例如打车票有出发时间、到达时间、车牌号;住宿票有入住人数,入住时间和退房时间;火车票有出发城市、达到城市、席位等级。共性和个性的属性交织在一起。怎么办?

在面向对象的分析中是可以设定分类的,父类是发票,子类是各种票,这样属性就继承下来,父类的数据可以动态聚合。但数据库的问题又来了,数据库分成各类明细发票的表,属性都在树叶表上。数据库不支持面向对象,数据库讲究的是关系代数,连接运算。面向对象就搞不下去了,这个叫做对象关系阻抗不匹配。https://www.toutiao.com/article/7022163867690107431/光是属性查询搞起来就累了,这么多发票表,都需要有汇总查询的方法,你说累不累。方法也是一样的,发票有个方法叫做作废,超过六个月的各种发票都要自动作废。没有继承关系,就这么一句话的需求,够程序员忙活半天的。程序员就在这种互相矛盾的概念夹缝中生存,还过得挺好,一会Java一会SQL,忙得不亦乐乎,但其实本质效率不高啊。#Java##程序员##程序#

不懂就问,JAVA开发,面试如何判断为p6还是p7?技术点深度么?具体点比如volatile,synchronized等讲到什么地步?spring呢?jvm呢?数据库呢?以及后台架构设计,手撕代码完美度等等。真心求教各位p7p8大大们。

-------------------

7是既需要广度,也需要深度,还要你对架构有比较深的理解和见解以及落地经验

如何判断一个类是无用的类?

方法区主要回收的是无用的类,那么如何判断一个类是无用的类呢?

类需要同时满足下面3个条件才能算是 “无用的类” :

(1) 该类所有的对象实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。

(2) 加载该类的 ClassLoader 已经被回收。

(3) 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

Java并发编程之美(博文视点出品)

VB/VBA的解释器出来的那么早,为何没能跨平台?

1、VB/VBA的解释器,才是真正继承BASIC衣钵的那一脉。大家或许对1970年代的BASIC风靡一时有所耳闻,仔细想想,那时可是大中型机当道的时代。世界上主要的操作系统,都才刚开始有想法,几乎还是一机一码的时代,为何BASIC能够独领风骚?其实,最根本的原因,便是DEC为了让BASIC在各大机器上运行,放弃了编译机制,改用解释机制。

解释器,今天叫虚拟机,可以保证在靠近人的这一端,以不变的姿态(比如源码编写和提交)应万变(不同类型的机器平台)。看看今天的JAVA、Python、.NET,就知道这是一顶好的设计,应该说BASIC也算是解释型语言的鼻祖了,可为何没能在今天的跨平台编程界留下一席之地呢?不仅其子孙VB/VBA成了业界黑户,而且在其他平台上也没能出现旗鼓相当的选手,这是为何呢?

2、回顾历史,『机缘巧合和时势造英雄』应当最为贴切。BASIC的简单易用,极大降低了计算机的使用门槛,这是它在各大机器上受欢迎的外在驱动力。而内在的,就需要程序员为各类不同的机器编写解释器,以便用户能在不同机器上以近乎相同的方式进行使用。那时的计算机硬件制造,算是百花争鸣的时代,有很多厂商都在生产,因此写解释器的生意供不应求,甚至成为一个细小的行业。

比尔盖茨和他的伙伴,恰好处于这样的环境,写解释器成为轻资产创业的不二之选。应当说,微软的基因里一开始就是要处理不同平台的需求,对于跨平台绝对是有很深的理解的。只可惜,硬件性能未跟上,业界对于解释机制视若过街老鼠,对其性能表现嗤之以鼻。或许是微软认清了现实,也或许是PC的头部(英特尔)开始形成,微软于1983年,给出了编译版的BASIC。

但并未获得IBM的认可,具体原因已无从查证。IBM强迫英特尔将芯片的生产销售许可授权给AMD,让英特尔亲手扶植了一个强大的竞争对手。或许大家可从这件事里看出些端倪,那就是IBM更希望客户或供应商处于充分的竞争环境,而不是拥有垄断地位来增强对IBM的议价能力。

随着DOS系统越来越不能胜任,1989年微软开始与IBM合作研发OS/2,为放弃DOS做准备。1991年,全鼠标驱动的BASIC随Windows3.0发布,微软也最终与OS/2分道扬镳。从这里,其实可以看出大家各有各的想法,只不过微软的野望更大而已,IBM终究不过是微软壮大的营养来源。

3、JAVA崛起后,准确地说是互联网崛起后,微软的种种应对,应当都是围绕当初的野望展开的。从早期的.NET的伪跨平台,到后来的Win8霸屏的企图,微软一统江湖的心思不再躲躲藏藏。如果对PE结构有了解的细心人,就会发现,PE结构早就将微软的雄心暴露无遗了。

PE是Windows上可执行程序文件的格式,比如各种应用程序的EXE/DLL/OCX/SYS等文件,就是该采用的该结构。不得不承认,从16位到32位,再到今天的64位,PE结构极具前瞻性。大家总是很奇怪微软的兼容能力为何如此变态,甚至疑问那得堆多少屎山啊。其实,人家在架构时,早就算计了,好吧!PE结构从32到64几乎没有变动,所以64位Win上的32位应用才能左右逢源。

看看具体的,IMAGE_FILE_HEADER中的Machine,用于标识应用程序适用的CPU类型,好家伙:IntelX86和IA64系列、MIPS系列、Alpha、SH系列、ARM系列、IBM PowerPC系列、AMD系列,几乎市面上能看到的CPU都包含了。

再来看看IMAGE_OPTIONAL_HEADER32的Subsystem,用于标识应用程序运行的操作子系统,有OS/2的身影,也有Posix、CE、EFI、XBOX的身影,更别提Win11里的Linux子系统了。

从这些痕迹,大概就能判断出,微软的Windows其实想做成操作系统的母系统。

4、所以,JAVA的一处编写,处处编译运行的跨平台,在微软的字典里,她其实是看不上的。微软要的,是一处编译,到处运行的大一统。或者说,微软压根就认为,跨平台是系统的事,而非应用程序层面的事。

看看在这一概念下,微软干了些什么?微软在Win10出了ARM版,完美兼容Office等Win32应用,VB/VBA也可以运行在ARM芯片上。微软在Win11出了Linux版,前两天微软再次宣布会在Win11中全面优化Win32,相信不久Win32应用就可以跑起来了。

所以,VB/VBA的解释器,就不太可能出海!很多事情,也就可以得到解释了。

[心]欢迎关注BtOfficer[心](收藏、点赞、关注+转发),更多精彩仍在继续哦(专栏文章将更系统,更全面,但需要阁下支持哦),有严肃的技术,也有轻松的唠嗑,期待你的加入!

JMeter基础篇,想知道一个接口返回结果是否正确,一篇微头条搞定

一、前言

JMeter是基于Java语言开发的一款接口和性能测试工具,平时我们热衷于用它开展接口和性能测试。

二、我们为什么要检查接口返回信息?

1、做测试的目的是发现问题。

2、如何发现问题?

3、如何判断一个问题就是Bug?

通过以上三个问题的思考,大家试想下平时我们在功能测试过程中是如何来判断Bug的?

重点:根据需求规格说明书要求,判断用例的预期结果和实际结果进行比较,如果相则不是bug,如果不想等则是bug。

那么使用工具又是如何判断用例的结果正确性呢?接下来详细与大家分享。

三、JMeter怎样检验接口返回结果是否正确,使用断言来解决。

1、首先准备好JMeter环境。

2、开发自动化脚本。

3、调试脚本通过。

4、添加断言(设置检查点)。

5、运行脚本,查看结果返回信息正确性。

总结:通过以上三个步骤的详细讲解,接口测试的脚本与业务已经准备完成,接下来基于实战进行演示。

实际案例实战过程,如下图所示:

#开源项目推荐#一款前后端分离具备H5、小程序、APP、PC端的开源考试系统。

开源考试系统是一款 Java + Vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持多种题型:选择题、多选题、判断题、填空题、解答题以及数学公式。支持WEB端和微信小程序,能覆盖到PC机和手机等设备。 支持多种部署方式:集成部署、前后端分离部署、docker部署。

详细介绍:网页链接

如何判断一个元素在亿级数据中是否存在?

网页链接

经验之谈:内存泄露的原因以及分析

内存泄露是Javaer听到最多的关于内存的事了,这篇文章就来谈谈这件事。

内存泄露与资源泄露

什么是泄露?泄露在计算机语境下,通常指的是某个资源无法被访问,也无法被释放。

内存泄露一般发生在某个对象的引用丢失,无法再访问到该引用,但是该引用却依旧引用着某个对象,导致这个对象无法回收,最终导致内存溢出OOM。

资源泄露一般发生在连接池,IO流等场景,如从连接池中每次都新建连接但不关闭,每次都打开新的IO流但不关闭,等等情况。

内存泄露发生的情况

内存泄露多发生于static的集合中,比如当你定义了一个static HashMap,此时将某个key-value放入其中后,方法段结束。

这时,除非调用map的clear方法,否则显然该value将无限持有对象的引用,无法释放。

public static Map<String,Object> objectMap=new HashMap<>(); public static void main(String[] args) { Integer a=new Integer(1); objectMap.put("testKey",a); }

这种写法看似可笑,却很难避免,尤其在大量框架代码中,反而更容易发生,因为大部分框架代码对业务代码的增强,都是通过AOP方式来做的,此时对业务代码来说,这类隐式的static Map难以防范。

内存使用过高,一定是内存泄露吗?

内存使用过高,并不一定是内存泄露导致的结果,具体要看内存堆的分析。

一般内存泄露最直观的体现就是:

内存使用高

GC回收不了内存,即GC前后堆大小几乎无变化

JVM疯狂GC,CPU打满

Java进程触发Linux操作系统的OOM-killer,Java进程被杀死

或者CPU被GC任务打满,服务器实际宕机。

但是这不一定是泄露导致的,也有可能是内存的错误使用导致的,不过大同小异,主要还是需要排查异常内存的使用。

Ps:之所以作者这么说,是因为作者曾经在线上遇到了架构组修改日志框架,错误的将日志内容作为了key存入了map,本应的key-value应该为traceId-日志内容,结果架构组却将key-value搞反了,导致大量的巨大key打满了内存,堆dump文件里全是几十k几十k的字符串。

如何避免内存泄露

根据上面说的内存泄露多数发生的情况,避免内存泄露的策略也就十分简单了。

尽量使用局部变量

减少使用static集合

如果必要的使用static集合,尽量使用弱引用等低级引用。比如参照ThreadLocal中的设计:TheadLocal原理

内存泄露问题如何排查

内存泄露或内存持续使用较高时,通常通过堆的情况来排查。

首先可以通过jmap -histo:live pid|less 命令,查看堆内对象使用情况。此时如果内存泄露,一般都是会某个基本类型对象过多,然后可以与正常的服务作对比,看哪个对象的数量异常的多,此时如果可以判断出来,也没必要dump了。

如果通过jmap无法断定,则可以使用jmap -dump:live,format=b,file= 命令,生成dump文件。

将dump文件通过java原生的软件或者eclipse的mat工具,就可以看到哪些对象占用过多,此时你应该关注的是非基本类型对象的其他对象,因为一般来说都是基本类型的数量和大小最多。

一般来说,你会看到以下现象:

某个map的Node十分多,有几十万个。

某个框架的某个对象十分多。

char数据,也就是C[],占用十分多,因为有很多大字符串。

本文作者:IntoTw

本文链接:经验之谈:内存泄露的原因以及分析 - IntoTw - 博客园

最近经常遇到人说,java面试时背八股文的问题,那么今天想和大家讨论下,哪些问题算是八股文呢?

像protected修饰的类和方法的访问权限,int类型占几个字节,hashmap和arraylist是不是线程安全的等等这种问题,怎么判断字符串是否为空的问题算是八股文吗?我认为这些不算八股文的,因为这些是基础中的基础了,是作为一个java程序员必须要掌握的东西了,最起码是作为一个中级的java必须掌握的东西了,如果这些基础的东西都不知道,你写出的代码又何谈健壮性呢,但是我在面试中级java的时候,竟然有很多人说没有去背这些东西,这真的让我无法理解。

但是在面试的过程中,问题的各种算法,像冒泡排序,快速排序等等,这些就是最典型的八股文了,因为在实际工作中根本就用不到这些东西,不会这些东西在正常不过了,不会这些东西完全不影响你写代码,而且说如果真的需要在工作中用到这些东西,花几分钟的时间百度一下就会了,完全没有必要在面试的时候纠结这些东西。

大家觉得呢,欢迎评论区讨论[微笑]

我本来是个java程序员,但公司有个老系统是用php写的,因为它已经上线好多年了,平时改动很少,公司又没有专职的php程序员,领导说语言都是相通的,所以让我负责维护这个系统。

这个系统的代码属于那种只敢远观不敢乱动的类型,代码完全没有可读性,到处都是复制粘贴的代码。今天碰到个看上去很简单的问题但差点把我搞吐血了。

快下班的时候客服说有个用户反馈了一个问题,就是一个订单查询页面,有的查询条件查出来的结果页面是正常的,有的查询条件查出来的结果显示不全且没有分页信息,让我赶紧看看。

刚开始我觉得很简单,以为是前台显示有问题,搞两下就能下班了。但分析了一下不是前台的问题,其他用户没问题,就这个用户有问题,还是在特定的查询条件下才有问题,于是根据我的经验判断这个肯定是数据问题引起的。

但我又不能确定是什么数据导致的代码出现了异常,这下可就麻烦了。如果是java写的就好办了,一般这种问题都会有异常抛出来,查下日志就知道了。可这个php系统没有这方面的异常信息日志。

我只能通过最笨的方法:删代码追个排除法了,来发现是哪行代码的问题,最终确定是什么数据导致的。但这个代码也不能乱删,不能有语法问题而影响正常的运行,于是我根据经验开始是一片一片地删,缩小范围,然后几行几行删,最后是一行一行删,最终确定了出问题的那行代码(见截图里的520行的代码)。

一看那行代码很简单,就是调用了一个sdk的一个方法对订单收件人姓名进行解密。这个sdk是某电商互联网大厂的,难道这还会有问题?但经过反复的确认确实是sdk有问题,改源码肯定是不怎么现实,现在就是要分析出那条数据出了问题,把它改了就行了。于是我逐渐缩小查询范围,最终确定了某条数据。

我发这条数据的订单号让客户查了下这个订单真实的收件人姓名,原来是个叫"0"的人,加密后是一串密文和其他的也没什么区别。于是我直接把这个订单的收件人改成了"0"。因为那个解密的方法对明文和密文都是支持的,如果碰到是明文就不需要解密,所以改成明文也不会有问题。

改完后运行看结果一切都正常了,唉,互联网大厂做的东西也考虑得不全面有bug啊!可能是我对php不是很熟,我这排查问题的方法对不对,不知道各位php大神碰到这种问题一般是怎么定位的。

大家知道为什么程序员经常加班了吧,那些有996加班文化的公司我们就不说了,就今天我碰到的这种情况应该也很多,临时出个什么问题,还要及时解决的,不加班咋整呢?

java它不香吗?为什么还有那么多人喜欢用php,还说php是世界上最好的语言,真的搞不懂。

未来10年,我判断工控行业,西门子三菱退出中国历史舞台,codesys为应用国产plc而生。C#范围可能会缩小(基于大学现场基本开的是java的课程),具体什么会代替C#还不好说。毕竟目前是工控上位首选

昨天的 “一行代码引发的血案” 事件,教训惨痛,今天出去玩的心情都没有了,为了避免类似情况发生,连夜总结了一些程序员工作中应该注意的一些事项,分享给大家。

1、java代码的非空判断只嫌少不嫌多,在使用一个对象前没有100%的把握不为空一定要做非空判断。

2、java里try catch全局的Exception异常很不好,有时候还非常危险,一定要捕获具体的异常然后做对应的处理。

3、循环递归调用的方法一定要谨慎再谨慎,一不留神可能就会引起内存泄露或者会引起重大事故。

4、重要的方法一定要做好全方位的单元测试,重要的业务一定要做好全方位的功能测试。

5、代码review不能少,特别是像发短信这种出了问题就很严重的功能一定要仔细review。

6、最重要的一点,程序员一定要做好24小时待命的准备,如果线上出现严重问题不及时解决造成公司严重损失,轻则可能饭碗不保,严重的可能还会面临被公司起诉。

细节决定成败,让我们做一个认真严谨的程序员。

#Java#聊聊在 Java 开发中怎样更好地规避 NPE 异常。

NPE(NullPointException)异常是大家比较常见的异常,大部分互联网公司在生产环境是严禁有 NPE 出现的,也就是 0 容忍。

NPE 异常是一个运行时异常(RunTimeException),也可以称之为:非受检异常,这种异常我们一般是不需要特定处理的。

但非受检异常也分为好几种情况:(1)可忽略的异常,就是有些异常框架或系统会帮我们捕获并处理,我们上层应用可以忽略。(2)需要捕获的异常,比如一些 RPC 应用中服务端抛出的异常,这种异常我们可能需要重试或降级处理。(3)可预测的异常,像 IndexOutOfBoundsException 和 NullPointException 都属于这种异常。基于我们系统或代码稳定性、健壮性和性能考虑这种异常是不应该产生或被抛出的,而应该提前做好边界检查和空指针判断。也没有显示地捕获这类异常,会对我们程序的可读性和运行效率产生很大影响。

那我们实际开发中该怎样更好地规避 NPE 异常呢?我给大家提几个比较好的建议。

(a) JDK 8 后使用 Optional 进行非空判断;

(b)字符串相同比较时,不要直接使用 a.equals(b)这样判断,如果 a 为 null 那就直接 NPE ,建议大家使用 Apache commons 工具包下的 StringUtils.equals方法进行比较,因为这些方法已经帮你考虑到 NPE 的情况了;

(c) 当一个 Integer 类型(int的包装类)和一个 int 值进行大小比较时,不要直接使用 a == b 这样去比较,因为这会涉及到拆箱的操作,如果 Integer 类型为 null 值,拆箱时就会抛 NPE。建议大家使用 JDK 的 Objects.equals 方法,因为方法本身就考虑到 NPE 了。

(d)JDK 8 以后大家可能会经常使用集合的 stream 的相关操作,当我们对 map 后的对象集合进行比较或分组操作时(比如:max,min、reduce)一定要考虑到 map 后的对象是否为 null,否则可能会抛 NPE。

JDK8中CompletableFuture提供了优雅的异步回调能力,在JDK8之前,我们使用Java多线程编程主要是 Thread+Runnable 来完成,但这种方式有个弊端就是没有返回值,如果想要返回值怎么办呢?大多数人就会想到 Future Callable + Thread 的方式来获取返回值,如下图二。

但这种方式task.get()的时候,当前主线程是阻塞状态,另一种方式获取返回值就是通过轮询 task.isDone() 来判断任务是否完成获取返回值,但这些都有一定的局限性,而在JDK8中CompletableFuture提供了优雅的异步回调能力,非常完美,如图一,几乎无瑕疵,求BUG#程序员# #夏日大作战#

技术做久了,就容易进入一个死胡同,认为技术决定一切。技术做的好,只算得上是一个“强人”,但不能称之为“牛人”

为什么业内很多测试工程师,性能也会搞,自动化也会搞,但是薪资就是吊在20k左右,对着年薪60W+的“大牛”望其项背?

因为他们并没有搞懂,什么是技术,什么是能力。

我举个例子,比如性能测试大家都会做,比如jmeter的使用,包括一部分还在用loadrunner,搞完了性能,出了一份性能报告,就完事了,那么如果你到了这个阶段,最多说你有做性能的技术,但是不代表你有能搞定性能的能力。

因为其中是存在一些问题的,比如:

只测不调,无法给出研发和运维人员执行建议

无法定位问题,缺乏清晰的逻辑和数据证明价值。

性能测试工具≠性能测试

如果你是真正的大牛,当你拿到性能报告的时候,你思考的是:

1.场景是否合理?

2.压力是否传递均匀或者传递到指定目标?

3.是否有干扰因素,或者说那些数据是否有效?

4.有没有一些可信的判断方法?

这个,叫做“能力”

#JAVA# #程序员# #IT培训# #外包# #测试工程师#

前天接手某同学的项目。他说这个项目有点难受。让我有心里准备。当我打开项目后发现项目中通篇全是Map,硬生生的将面向对象的Java给玩坏了。还有多层for循环,多层条件判断。十分不友好。我想将map优化成对象,通过对象提高代码可读性。你觉得这个代码还能从哪些方面抢救一下?@深漂小小熊#师者说# #我上头条#

儿子问我墨水屏计算器上的NaN是什么意思?我问他是不是除0了,他说是。我就知道这个开发计算器程序员完全没有检查除数为0的情况,直接就把结果显示在屏幕上java对这种情况直接返回NaN。正确的做法是要判断这个情况,显示一个错误,比方我的手机计算器就是这样。那除数为什么不能为0呢?我的解释是假设除数等于0,比方说5÷0=N,得到某个商N,这个N再乘以0就等于0,这个就违反了乘除正好相反的数学规则了,相当于整个数学基础都不存在了。你的解释是什么 #教育听我说#

ArchGuard 是一个架构治理工具,用于管理和分析组织级别的软件架构。 结合 C4 模型,进行依赖分析,含容器级别(服务级别)、组件级别(/模块级别)、代码级别、数据库级别等。 同时,可以创建系统的架构适应度函数,度量系统的各项指标。

特性(Features):

容器级别依赖分析(当前支持 HTTP API)。API 生产者支持语言:Java、Kotlin、C#,API 消费者支持语言:TypeScript/JavaScript、Kotlin、Java 等。 HTTP API 使用清单、调用清单 HTTP API 依赖可视化分析

五大维度架构质量评估以及对应的指标分析。 体量维度。过大的包、类、方法、模块 耦合维度。枢纽模块、包、类、方法,数据泥团、过深继承、循环依赖 内聚维度。霰弹式修改、数据类 冗余维度。冗余元素、过度泛化 质量维度(Java)。包含休眠的测试、被忽略的测试、缺乏校验的测试、包含繁杂判断的测试、包含冗余打印的测试、静态方法

代码坏味道分析。常见的那些。

还有其它相关的总览 代码间依赖分析。支持级别模块、包、类、方法四个级别。 代码行数分析。 系统不稳定性模块分析。

数据库地图(进行中)

精准测试/变化分析(进行中)

ArchGuard 内置两个代码分析引擎:Bytecode 分析 + 源码分析。

Bytecode 分析。顾名思义,就是通过分析 JVM 中的字节码,从而分析出代码中的依赖关系

源码分析。即通过分析生成编译语言的语法树,产出特定的数据结构

源码分析主要是静态分析,结合先前在重构自动化开源组织 Modernizing 下开源的 Chapi 代码分析引擎。Chapi 基于 Antlr 实现的语法分析,支持主流的编程语言:TypeScript/JavaScript、Kotlin、Java、C# 等等。

项目地址:网页链接

#开源项目精选#

本文来自网络,不代表本站立场。转载请注明出处: https://tj.jiuquan.cc/a-2137557/
1
上一篇ipad操作系统(ipad操作系统降级)
下一篇 怎么安装打印机(怎么安装打印机墨盒)

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: alzn66@foxmail.com

关注微信

微信扫一扫关注我们

返回顶部