首页 文章 精选 留言 我的

精选列表

搜索[文档处理],共10000篇文章
优秀的个人博客,低调大师

sqltoy-orm 4.18.18 发版,优化 sql 中注释处理、缓存未匹配日志输出等

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装):https://github.com/threefish/sqltoy-idea-plugins 更新内容 1、优化部分极端场景sql中单行注释没有被剔除的缺陷 2、修复部分数据库getUpdateCount() 提示信息不准确问题 3、缓存翻译在未匹配到时,当有未匹配模板时不输出日志 4、spring依赖包版本升级

优秀的个人博客,低调大师

每日一博 | 事务处理不当,线上接口又双叒内存泄漏了

情景 项目上线了一个接口,先灰度一台机器观察调用情况; 接口不断的调用,过了一段时间,发现机器上的接口调用开始报OOM异常 ! 当天就是上线deadline了,刺激。。 发现问题 第一步,使用jps命令获取出问题jvm进程的进程ID 使用jps -l -m获取到当前jvm进程的pid,通过上述命令获取到了服务的进程号:427726 (此处假设为这个) jps命令 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟机进程 jps -l -m : 参数-l列出机器上所有jvm进程,-m显示出JVM启动时传递给main()的参数 第二步,使用jstat观察jvm状态,发现问题 因为是OOM异常,所以我们首先重启机器观察了JVM的运行情况; 我们使用jstat -gc pid time命令观察GC,发现GC在YGC后,GC掉的内存并不多,每次YGC后都有一部分内存未回收,导致在多次YGC后回收不掉的内存被挪到堆的old区,old满了之后FGC发现也是回收不掉; 这里基本可以确定是内存泄漏的问题了,下面我们有简单看了下机器的cpu、内存、磁盘状态 jstat命令: jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 jstat -gc pid time : -gc 监控jvm的gc信息,pid 监控的jvm进程id,time每个多少毫秒刷新一次 jstat -gccause pid time : -gccause 监控gc信息并显示上次gc原因,pid 监控的jvm进程id,time每个多少毫秒刷新一次 jstat -class pid time: -class 监控jvm的类加载信息,pid 监控的jvm进程id,time每个多少毫秒刷新一次 在这里先简单说一下,堆的GC: 在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。 年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的,minor GC会一直重复这样的过程。 第三步,观察机器状态,确认问题 使用top -p pid获取进程的cpu和内存使用率;查看RES 和 %CPU %MEM三个指标: 在这里先简单说一下,top命令展示的内容: VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小 SHR:shared memory 共享内存 1、除了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out后,它将会降下来 DATA 1、数据占用的内存。如果top没有显示,按f键可以显示出来。 2、真正的该程序要求的数据空间,是真正在运行中要使用的。 ps : 如果程序占用实存比较多,说明程序申请内存多,实际使用的空间也多。 如果程序占用虚存比较多,说明程序申请来很多空间,但是没有使用。 发现机器的自身状态不存在问题, so毋庸置疑,发现问题了,典型的内存泄漏。。 第四步,使用jmap获取jvm进程dump文件 我们使用jmap -dump:format=b,file=dump_file_name pid 命令,将当前机器的jvm的状态dump下来或缺的一份dump文件,用做下面的分析 jmap命令: jmap(JVM Memory Map)命令用于生成heap dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。 jmap -dump:format=b,file=dump_file_name pid : file=指定输出数据文件名, pid jvm进程号 接下来,回滚灰度的机器,开始解决问题=.= 解决问题 第一步,dump文件分析 在这里,我们分析dump文件,使用的Jprofiler软件,就是下面这个东东: 具体的使用方法,在这就不再赘述了,下面将dump文件导入到Jprofiler中: 选择Heap Walker 中的Current Object Set,这里面显示的是当前的类的占用资源,从占用空间从大到小排序; 从上图中,没有观察出什么问题,我们点击Biggest Objects,查看哪个对象的占用的内存高: 从上图中,我们发现org.janusgraph.graphdb.database.StandardJanusGraph这个对象居然占用了高达724M的内存! 看来内存泄漏八九不离十就是这个对象的问题了! 再点开看看 ,如下图,可以发现是一个openTransactions的类型为ConcurrentHashMap的数据结构: 第二步,源码查找定位代码 这到底是什么对象呢,去项目中查找一下,打开idea-打开项目-双击shift键-打开全局类查找-输入StandardJanusGraph,如下图: 发现是我们项目使用的图数据库janusgraph的一个类,找到对应的数据结构: 类型定义: private Set<StandardJanusGraphTx> openTransactions; 初始化为一个ConcurrentHashMap: openTransactions = Collections.newSetFromMap(new ConcurrentHashMap<StandardJanusGraphTx, Boolean>(100, 0.75f, 1)); 观察上述代码,我们可以看到,里面的存储的StandardJanusGraphTx从字面意义上理解是janusgraph框架中的事务对象,下面往上追一下代码,看看什么时候会往这个Map中赋值: // 找到执行openTransactions.add()的方法 public StandardJanusGraphTx newTransaction(final TransactionConfiguration configuration) { if (!isOpen) ExceptionFactory.graphShutdown(); try { StandardJanusGraphTx tx = new StandardJanusGraphTx(this, configuration); tx.setBackendTransaction(openBackendTransaction(tx)); openTransactions.add(tx); // 注意! 此处对上述的map对象进行了add return tx; } catch (BackendException e) { throw new JanusGraphException("Could not start new transaction", e); } } // 上述发现,是一个newTransaction,创建事务的一个方法,为确保起见,再往上跟找到调用上述方法的类: public JanusGraphTransaction start() { TransactionConfiguration immutable = new ImmutableTxCfg(isReadOnly, hasEnabledBatchLoading, assignIDsImmediately, preloadedData, forceIndexUsage, verifyExternalVertexExistence, verifyInternalVertexExistence, acquireLocks, verifyUniqueness, propertyPrefetching, singleThreaded, threadBound, getTimestampProvider(), userCommitTime, indexCacheWeight, getVertexCacheSize(), getDirtyVertexSize(), logIdentifier, restrictedPartitions, groupName, defaultSchemaMaker, customOptions); return graph.newTransaction(immutable); // 注意!此处调用了上述的newTransaction方法 } // 接着找上层调用,发现了最上层的方法 public JanusGraphTransaction newTransaction() { return buildTransaction().start(); // 此处调用了上述的start方法 } 在我们对图数据库中图数据操作的过程中,采用的是手动创建事务的方式,在每次查询图数据库之前,我们都会调用类似于dataDao.begin()代码, 其中就是调用的 public JanusGraphTransaction newTransaction()这个方法; 最后,我们简单的看下源码可以发现,从上述内存泄漏的map中去除数据的逻辑就是commit事务的接口,调用链如下: public void closeTransaction(StandardJanusGraphTx tx) { openTransactions.remove(tx); // 从map中删除StandardJanusGraphTx对象 } private void releaseTransaction() { isOpen = false; graph.closeTransaction(this); // 调用上述closeTransaction方法 vertexCache.close(); } public synchronized void commit() { Preconditions.checkArgument(isOpen(), "The transaction has already been closed"); boolean success = false; if (null != config.getGroupName()) { MetricManager.INSTANCE.getCounter(config.getGroupName(), "tx", "commit").inc(); } try { if (hasModifications()) { graph.commit(addedRelations.getAll(), deletedRelations.values(), this); } else { txHandle.commit(); // 这个commit方法中释放事务也是调用releaseTransaction } success = true; } catch (Exception e) { try { txHandle.rollback(); } catch (BackendException e1) { throw new JanusGraphException("Could not rollback after a failed commit", e); } throw new JanusGraphException("Could not commit transaction due to exception during persistence", e); } finally { releaseTransaction(); // // 调用releaseTransaction if (null != config.getGroupName() && !success) { MetricManager.INSTANCE.getCounter(config.getGroupName(), "tx", "commit.exceptions").inc(); } } } 终于,我们找到了内存泄漏的根源所在:项目代码中存在调用了事务begin但是没有commit的代码! 第三步,修复问题验证 解决问题: 找到内存泄漏接口的代码,并发现了没有commit()的位置,try-catch-finally中添加上了commit()代码; 提交-部署-发布-灰度一台机器后观察内存泄漏的现象消失,GC回收正常; 内存泄漏问题解决,项目如期上线~ 最后 大家,有没有遇到过内存泄漏的情况,欢迎在评论区说出你的故事=.= 写这篇文章耗费的时间超出了我的预料,预计2个小时写完,结果花了一下午的时间... 原创不易,如果大家有所收获,希望大家可以点赞评论支持一下~ 也欢迎大家关注我的oschina和微信搜索公众号[匠心Java]支持一下作者,作者定期分享工作中的所见所得~

优秀的个人博客,低调大师

【云栖号案例 | 金融】上海行列秩智能科技有限公司大数据处理平台

云栖号案例库:【点击查看更多上云案例】不知道怎么上云?看云栖号案例库,了解不同行业不同发展阶段的上云方案,助力你上云决策! 公司介绍 行列秩以人工智能和计量金融为技术基础,致力构建消费金融的资产定价及评级体系,推动整个行业的资金资产融合进入计量时代。 行列秩专注于消费金融的资产定价。2019年3月成立以来,行列秩精耕信托,依托自身技术及风控模型能力,创新性地为信托机构的消费金融业务解决风控需求,成功地为各大信托机构降低了风险率,实现了价值最大化,迅速地赢得了业内的一致好评,陆续获评“2019年度信托智能风控引领机构”、“2019年金融科技领军品牌”、“2019年普惠金融智能风控创新奖”。 2020年3月,行列秩与东华软件落地科技合作项目,开启了行列秩发力银行消费金融的新征程,双方将在深耕信托消费金融的基础上,共同开展针对银行等金融机构的科技智能化创新合作,构建智能科技金融生态伙伴圈。 行列秩已经获得来自于云南国际信托等多家机构数千万投资。 行列秩的产品和服务覆盖消费金融业务全流程,核心产品和服务体系主打以“布尔数”、“布尔引擎”、“布尔中台”为代表的信用评估&决策平台系列产品以及定制化的咨询服务。 业务痛点 逻辑计算效率低下,服务器资源占用过高,需要升级。线下系统老旧,服务器稳定性差。计算效率无法满足业务需求。 集中部署,资源抢占严重,决策引擎,数据交互服务等严重资源不足 用户增长带来较大的扩容压力。线下IDC资源有限。 解决方案 解决方案架构图 方案细节: 前后端业务业务隔离: 1.前端业务承接流量:高并发访问的前端业务做负载均衡多活架构,可轻松实现横向扩展。为未来业务增长打好基础。2.后端做高规格服务器实现业务计算,打造服务中心:实现决策引擎、数据交汇以及其他非核心业务。后端数据库使用Redis做高并发缓存,异步同步到MySQL。 数据存储:使用RDS for MySQL轻松实现双机热备,保障数据安全和业务可靠性。 安全防护:使用WAF、安骑士和SSL证书产品保障主机安全、防范入侵。确保业务上线后平稳运行避免入侵或者攻击风险。 上云价值 阿里云服务团队帮助行列秩搭建了扩展性强、高并发且稳定的业务系统,可随业务成长而扩展的可持续发展运行环境。 选用的产品 云服务器ECS 云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力您的业务发展。更多关于云服务器ECS的介绍,参见云服务器ECS产品详情页。 负载均衡SLB 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。更多关于负载均衡SLB的介绍,参见负载均衡产品详情页。 云数据库 Redis 版 阿里云数据库Redis版是兼容开源Redis协议标准、提供内存加硬盘混合存储的数据库服务,基于高可靠双机热备架构及可平滑扩展的集群架构,可充分满足高吞吐、低延迟及弹性变配的业务需求。更多关于云数据库 Redis 版的介绍,参见云数据库 Redis 版产品详情页。 云数据库RDS MySQL版 MySQL 是全球最受欢迎的开源数据库之一,作为开源软件组合 LAMP(Linux + Apache + MySQL + Perl/PHP/Python)中的重要一环,广泛应用于各类应用场景。更多关于云数据库RDS MySQL版的介绍,参见云数据库RDS MySQL版产品详情页。 【云栖号在线课堂】每天都有产品技术专家分享! 在线课堂地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态! 【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

优秀的个人博客,低调大师

SAP CRM中间件下载时数据库表CRMATAB为空的处理方法

Sent: Tuesday, July 22, 2014 11:30 AM Subject: RE: how to fill empty table How to resolve empty table issue in ERP: Run report SMOF_FILL_CRMATAB in CRM system: Mark checkbox “All objects”: 发现自己没有RFC的权限,可在debugger里跳过line 18~23的权限检查: 执行完之后table CRMATAB里就有值了。 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册