
Java
文章平均质量分 60
串一串cc
微信公众号:cyc_java
展开
-
记一次线上JVM优化
夜黑风高的周末夜晚,正躲在书房追剧刘老根4,突然手机开始震个不停,心想难道是我的比特币要炸了吗?慌忙拿起手机的那一刻突然想起来我好像买不起比特币(心凉半截),原来是在公司群里被人艾特了,原来是S部门的某个Java服务出现了性能问题,找我这个Z部门的人帮忙看一下,描述是这样的:白天的时候jvm涨的快,gc的几秒就完成了到了晚上低峰期,jvm会涨的非常慢,但是一旦满了,就需要一两分钟时间进行gc,所以每隔一大段时间,会卡住一两分钟一次GC需要一两分钟的时间,最快的时候也需要几秒钟,心里一紧,这是个大活原创 2021-05-09 21:47:08 · 419 阅读 · 1 评论 -
Cannot Determine Value Type From String ‘Xxxxxx‘
在使用MyBatis的时候,若实体类上使用了lombok的@Builder注解,那么在查询数据做映射的时候会出现Cannot determine value type from string 'xxxxxx'错误,产生这个错误的原因是当使用了@Builder注解之后会默认把无参构造方法忽略掉,创建一个全参的构造方法,比如1234567...原创 2020-06-09 00:55:00 · 9618 阅读 · 2 评论 -
JVM指针碰撞和空闲列表
Java堆是被所有线程共享的一块内存区域,主要用于存放对象实例,在堆上为对象分配内存就是把一块大小确定的内存从堆内存中划分出来,将对象放进去。常用的分配方法有指针碰撞和空闲列表两种实现方式。 指针碰撞适用于堆内存完整的情况,已分配的内存和空闲内存分表在不同的一侧,通过一个指针指向分界点,当需要分配内存时,把指针往空闲的一端移动与对象大小相等的距离即可,用于Ser...原创 2020-06-09 00:55:00 · 3379 阅读 · 0 评论 -
统计Java代码行数
统计Java应用中的代码行数,仅除去注释,非有效代码行数12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455...原创 2020-06-09 00:55:00 · 262 阅读 · 0 评论 -
getClassLoader能否为null
前言我们Javaer都知道类想要被加载是需要一个个ClassLoader来执行的,并且类加载的方案叫双亲委派模式,说是双亲,其实就是单亲,可能我们最初的翻译人想让我们的加载器的家庭更完整吧,所以翻译成双亲。默认的类加载器包括BootstrapClassLoader、ExtClassLoader、AppClassLoader,他们都定义在在rt.jar中的sun....原创 2020-06-09 00:55:00 · 431 阅读 · 0 评论 -
设置生成CGLib和JDK代理生成的class文件
jdk和cglib代理方式属于是老生常谈了,这里就不说了,我们说一下特别的。我们都知道cglib是针对于类,jdk是针对于接口,cglib在目标类被代理后会自动生成目标类的子类,也就是xxxclass$$EnhancerByCGLIB$$c03f68c4.classjdk代理后会自动生成目标接口的实现,也就是$Proxy0.class我们平时代码在编译过程中...原创 2020-06-09 00:55:00 · 574 阅读 · 0 评论 -
慎用ArrayList中的SubList
双十一了,大家都省了多少钱啊?题外话:此处交给大家一个查看商品历史价格的小方法:在商品链接的域名后加上三个v就能查看到该商品的历史价格啦????http://shop.taobao.com/xxxx↓http://shop.taobaovvv.com/xxx步入正题,为什么说我们在实际开发过程中要慎用ArrayList的subLis...原创 2020-06-09 00:55:00 · 367 阅读 · 0 评论 -
Rmi远程服务调用简述
RMI是什么RMI(Remote Method Invocation)意为远程方式调用,顾名思义,是Java版的RPC实现技术,是建立分布式Java应用程序的方便途径。RMI是基于接口的,一般是接口定义和实现分开在不同的工程中。相似:Hessian,Burlap,Httpinvoker,webservice 为什么使用RMI它允许运行在一台虚拟机上的方法调...原创 2020-06-09 00:55:00 · 404 阅读 · 0 评论 -
Java内存模型JMM
原创 2020-06-09 00:55:00 · 72 阅读 · 0 评论 -
JVM垃圾收集算法浅谈
前言JVM是做Java的同学都必须要了解的东西,为什么这么说,因为我们只有知道了Java程序运行环境的配置和工作逻辑,才能对运行环境进行相关的优化和配置修改,让JVM在不同的服务器环境使用不同的配置,从而达到JVM环境最优化。说到JVM就不得不说一下GC(garbage collection),垃圾收集的意思是找到垃圾对象并回收掉它们,然后释放这些对象占用的内...原创 2020-06-09 00:55:00 · 107 阅读 · 0 评论 -
JVM命令之jmap
简介jmap是一个多功能命令,它可以生成Java应用的dump文件,也可以查看堆内对象的统计信息、查看ClassLoader信息和finalizer队列等,但是jmap会将整个JVM的线程全部暂停,所以在生产环境中慎重jmap命令。参数option:选项参数pid:进程IDexecutable:生成核心dump的Java可执行文件core:需要...原创 2020-06-09 00:55:00 · 1846 阅读 · 0 评论 -
JVM垃圾收集器介绍
曾经看到过一句话:如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。目前商业化虚拟机中常用的垃圾收集器有8种:新生代:Serial、ParNew、Parallel Scavenge,老年代:CMS、Serial Old、Parallel Old,整堆:G1、ZGC。图中连线的两个收集器是可以搭配使用,其所处区域表示收集器的作用域。 1...原创 2020-06-09 00:55:00 · 137 阅读 · 0 评论 -
JVM优化之分配速率
在实际的开发过程中,使用Java语言开发的应用基本上都会遇到性能问题,比如接口超时、服务器负载高、并发数低、数据库性能低或死锁等,并且现在随着互联网的发展,“猛快糙”的开发方式会让代码变得越来越臃肿,随着系统访问量的增加,各种性能问题就随之而来了。应用的性能问题非常多,比如磁盘、内存、网络IO、应用代码、数据库、缓存、JVM等,有前辈总结过可以将Java性能优化分...原创 2020-06-09 00:55:00 · 796 阅读 · 0 评论 -
JVM优化之提升速率
提升速率(promotion rate)是用于衡量单位时间内从新生代晋升到来年代的数据量,一般用MB/sec表示单位。JVM会将存活时间较长的对象从新生代提升到老年代,根据分代规则,老年代中不仅有存活时间长的对象,也有存活时间短的对象,这些存活时间短的对象的晋升过程就是过早提升,简单点讲就是对象存活时间尚未达到晋升年龄之前就被提升到了老年代。 测量提升速率一般...原创 2020-06-09 00:55:00 · 477 阅读 · 0 评论 -
聊一聊SPI
前言SPI全称是Service Provider Interface,是一种服务发现机制(哎,服务发现机制?和Zookeeper什么关系?)。SPI 的本质是将接口实现类的全限定名配置在文件META-INFO/services目录下以接口全限定名命名的文件中,并由服务加载器(ServiceLoader)读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实...原创 2020-06-09 00:55:00 · 304 阅读 · 0 评论 -
Java对象创建过程
一、概述在Java中,一个对象只要被正确的实例化之后才能被使用,在对象实例化的时候,会先检查相关的类信息是否已经被加载并初始化,在类初始化完毕之后才会继续完成对象的实例化,类的一生主要经历加载、连接(验证、准备、解析)、初始化、使用和卸载五个过程,创建类的对象就是在使用这个阶段。加载(Loading):通过类的全限定名查找和读取class文件,将读取的字节...原创 2020-06-09 00:55:00 · 251 阅读 · 0 评论 -
聊一聊负载均衡
前言负载均衡是实现服务高可用的一个关键性技术,在集群环境中,常常会将一个应用部署在多台服务器上同时提供服务,负载均衡将任务均衡的分配给不同的服务器,减少单一服务器的负载,达到水平扩容的目的,再者如果集群中某个节点的服务宕机了,负载均衡器会及时发现不可用的节点,并将其从集群服务节点中逻辑移除,此后的流量不会再转发到这台服务器上。 单点服务没有使用负载均衡的服务...原创 2020-06-09 00:55:00 · 277 阅读 · 0 评论 -
Java获取项目中的文件
Class.getResource()与ClassLoader.getResource()的区别Class.getResource()是指AAA.class.getResource()Class.getResource(String name):在当前class类的同一路径下查找资源ClassLoader.getResource(String nam...原创 2020-06-09 00:55:00 · 1996 阅读 · 0 评论 -
AQS基本概况
一、简介在Java中,谈到并发就不得不说到jdk中的J.U.C包,而说到此包必定要说到AQS(AbstractQueuedSynchronizer),从类名上可以看出这是一个抽象的、使用队列实现的同步器,AQS提供了一个FIFO队列,可以用于构建同步锁的基础框架,内部通过volatile的变量state来表示锁的状态,当state=0时表示锁空闲,当state&...原创 2020-06-09 00:55:00 · 232 阅读 · 0 评论 -
Java之OOM
java.lang.StackOverflowError栈溢出错误,这个错误很容易模拟,且看下面的代码:1234567891011121314151617public static void main(String[] args) { new StackOverflowTest().test();}private s...原创 2020-06-09 00:55:00 · 194 阅读 · 0 评论 -
Java常见线上故障排查方案
文章目录一、前言二、Java常见线上问题总结三、如何定位问题3.1、业务日志分析排查3.2、APM分析排查3.3、物理环境排查3.3.1 CPU分析3.3.2 内存分析3.3.3 磁盘分析3.3.4 网络分析3.4、应用服务排查3.4.1 CPU分析3.4.2 内存分析3.5、云厂商或运营商问题排查四、常用Linux分析命令4.1 CPU4.2 内存4.3 磁盘4.4 网络五、Arthas诊断命令5.1 下载安装5.2 启动Arthas5.3 开始诊断5.4 查看dashboard5.5 arthas常见命原创 2021-02-02 22:36:52 · 456 阅读 · 0 评论 -
idea打包Java工程为jar
目前创建Java工程大多是使用Maven或者Gradle了,但是在某种情况下,还是需要单独创建一个Java工程来做些事情,正巧最近机缘巧合需要搞这么个事情,因为idea将Java工程打成jar包还是有点麻烦的,所以就此记录一下我的使用方法,废话了半天,往下看吧。创建一个Java工程很简单,一直下一步就可以了加入依赖jar包新创建好的工程只有一个src目录,只能使用响应的jdk包中的类,我们创建一个名叫lib的Directory,然后把需要的jar包全部都copy到到该目录下,然后选中所有的原创 2021-01-17 00:04:51 · 272 阅读 · 0 评论 -
Nacos如何是怎么实现将多个配置项注入到同一个工程中的
在使用Nacos的时候,有没有想过如何将多个配置同时注入到一个工程中?比如下面的一个场景:多个项目工程的数据库配置一致,但是又有不同的私有化配置,根据抽象原则,我们是否可以将重复的配置信息单独放到一个共享的配置文件里,然后再给一些项目配置一个独享的配置文件呢?在使用本地配置的时候,可以给工程指定多个yaml或者xml等文件,然后加载器会根据路径将全部文件依次加载到项目运行环境中,那么使用Nacos怎么办呢?在Nacos中,提供了nacos.config.dataId配置参数,他可以接收一个配置文件名称原创 2020-12-03 00:02:56 · 2151 阅读 · 0 评论 -
Maven项目报错must be “pom“ but is “jar“
今天在创建新项目时,由于手误,出现了一个bug:must be “pom” but is “jar”,信息图如下:整个项目结构为:也就是code-ac的pom.xml的packaging应该是pom,但是在xml中未明确指定packaging,所以默认使用的是jar,因此出现了上面的bug。解决办法:在code-ac的pom.xml文件中指定packaging为pom即可。如果修改之后仍然继续报错,那么就把磁盘上的本地maven库中项目响应的包删除掉,也就是把缓存删除掉,即可。拓展:Q:原创 2020-07-03 00:02:46 · 7454 阅读 · 0 评论 -
JDBC连接MySQL
加载及注册JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance();JDBC URL 定义驱动程序与数据源之间的连接标准语法:(主要通讯协议)>:(次要通讯协议,即驱动程序名称)>:(数据源)>MySQL的JDBCURL格式:原创 2012-11-29 13:31:39 · 462 阅读 · 0 评论 -
JDBC
在JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。通过提交commit()或是回退rollback()来结束事务的操作。事务操作的方法位于接口java.sql.Connection中。在JDBC中,事务操作默认是自动提交。也就是,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()原创 2012-11-29 13:31:35 · 413 阅读 · 0 评论 -
java怎么连接sql server 2005
一、JAVA连接SQL的语句JAVA连接SQL2000语句为:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");DriverManager.getConnection("jdbc:odbc:数据库名","数据库登录名","登录密码");但连接SQL2005,已经改为:Class.forName("com.microsoft.sqlserve原创 2012-11-29 13:30:44 · 274 阅读 · 0 评论 -
execute、executeQuery和executeUp…
JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和execute。使用哪一个方法由 SQL 语句所产生的内容决定。方法executeQuery用于产生单个结果集的语句,例如 SELECT 语句。 被使用最原创 2012-11-29 13:30:33 · 363 阅读 · 0 评论 -
log4j详细配置(转)
第一步:加入log4j-1.2.8.jar到lib下。第二步:在CLASSPATH下建立log4j.properties。内容如下:1 log4j.rootCategory=INFO, stdout , R23 log4j.appender.stdout=org.apache.log4j.ConsoleAppender4 log4j.appender.stdout.layo原创 2012-11-29 13:32:06 · 341 阅读 · 0 评论 -
String、StringBuffer与StringBuil…
看看以下代码:将26个英文字母重复加了5000次,String tempstr = "abcdefghijklmnopqrstuvwxyz";int times = 5000;long lstart1 = System.currentTimeMillis();String str = "";for (int i = 0; i str = tempstr;}long lend1原创 2012-11-29 13:31:56 · 644 阅读 · 0 评论 -
关于Character类
今天要出去high,所以现在要把任务完成,只有缩短睡觉的时间来完成所定任务!刚才做一道ACM题时发现了一个以前没用过的类:Character!发现这一个类中封装好了好多字符判断的方法,例如isDigit(charch);isLetter(char ch);isSpaceChar(char ch);isWhiteSpace(charch);以及其重载方法!大大缩短了判断字符为何种类型所需的代原创 2012-11-29 13:31:52 · 354 阅读 · 0 评论 -
正则应用
将物理地址转换成windows中java可识别的形式:D://Devenv//Server//apache-tomcat-6.0.29//apache-tomcat-6.0.29//webapps//myHand//a.xml初级结果:public class Replaces {public static void main(String[] args) {Stringstr原创 2012-11-29 13:31:50 · 277 阅读 · 0 评论 -
Java Thread小结
1. 线程进程概念多线程: 单个程序内部好象在同一时刻运行多种运算.多进程: 同一时间内好象有多个程序运行.2. 线程状态2.1 创建状态2.2 可运行状态2.3 不可运行状态2.4 死亡状态2.1 创建状态(newthread)Thread TestThread = new TestThread();没有被启动,仅仅是空的线程对象,系统不为它分配资源.可调用方法:s原创 2012-11-29 13:31:07 · 402 阅读 · 0 评论 -
关于线程
日志返回日志列表[顶]关于线程2010-9-20 20:28阅读(2) 赞赞 赞赞转载分享评论复制地址举报编辑上一篇 |下一篇:如何学习Hibernat...首先要理解线程首先需要了解一些基本的东西,我们现在所使用的大多数操作系统都属于多任务,分时操作系统。正是由于这种操作系统的出现才有了多线程这个概念。我们使用的windo原创 2012-11-29 13:31:03 · 275 阅读 · 0 评论 -
给Java开发者的十条戒律
1.给你的代码加注解—每个人都知道这一点,但是总会有人忘记遵守。你有多少次“忘记”加注解了?的却不加文字注解有助于程序的功能性。但是一次又一你返回两星期前写的代码,结果你想不起来那是什么了!如果这个未注解的代码确实是你写的那你就是幸运的了。因为在那些代码中可以唤起你的记忆。不幸的是,大多数的时候代码是别人写的,而且他已将离开了公司!有句谚语是这样说的“自己的事情自己做”。所以为了别人或是我们自己考原创 2012-11-29 13:30:59 · 278 阅读 · 0 评论 -
Java打war、jar命令
1.通过DOS窗口进入到要打包的目录的父目录中,如图:此时想打包的目录为hissaas,所以进入到e:\saas目录即可2.执行打包命令执行打包命令jar -cvf hissaas.war hissaas命令jar -cvf中的-cvf选项可以运行jar -help命令查看相关说明及帮助hissaas.war为要打包成的文件名称,此处既可以打为war包,也可以打为jar原创 2012-12-03 10:58:28 · 621 阅读 · 0 评论 -
NoClassDefFoundError: com/sun/mail/util/LineInputStream
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream当出现以上错误时,解决办法:进到C:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt原创 2012-11-30 20:12:23 · 396 阅读 · 0 评论 -
javax.mail.AuthenticationFailedException异常
在使用mail.jar进行邮件接收开发时遇到了javax.mail.AuthenticationFailedException异常,根据异常名称可以看出是因为信息验证失败导致,如果遇到该问题首先应该查看设置的用户名和密码是否正确,如果信息错误修改正确之后再执行程序,如果还遇到此问题,则检查protected PasswordAuthentication getPasswordAuthentic原创 2012-11-30 20:09:23 · 1004 阅读 · 0 评论 -
深入equals方法
equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现equals方法,让对象用你认为相等的条件来进行比较.下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为这些规范在事实中并不是真正能保证得到实现.1.对于任何引用类型, o.equals(o) == true成立.2.如果 o.equals(o1) == true 成立原创 2012-11-29 13:31:14 · 336 阅读 · 0 评论 -
new和newInstance()的区别
在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别? 用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。 Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。 例如原创 2012-11-29 13:30:37 · 378 阅读 · 0 评论