Java内存区域与内存溢出异常
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 按照《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域。
来个图更加直观点,如下图所示:
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 按照《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域。
来个图更加直观点,如下图所示:
在JDK1.8 Hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) ,元空间使用的是直接内存,跟JVM内存无关。
字符串常量池中同时存在字符串常量和字符串引用。直接赋值和new String("xxx")
构造函数都可能导致常量池中生成字符串常量;
而intern()方法会尝试将堆中对象的引用放入常量池。
字符串的创建和使用几种典型常见。
REST API都是要对外提供服务的,那么文档是必须的。Swagger是一个简单但功能强大的API表达工具。 它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言, 都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。
2.X版本已经发布,Swagger变得更加强大。值得感激的是,Swagger的源码100%开源在github。
使用Swagger不纯粹是为了生成一个漂亮的API文档,也不纯粹是为了自动生成多种语言的代码框架, 重要的是,通过遵循它的标准, 可以使REST API分组清晰、定义标准。
通过Swagger生成API 文档有两种方式:
Swagger Editor
编写API文档的Yaml/Json定义。虽然第一种方式最方便,不用编写swagger配置文件,但是对代码污染太严重了。所以在项目里面我选择第二种方式, 另外我也不实用Swagger UI来展示API文档,页面太花哨了。 这里我选择swagger2markup将其转换为AsciiDoc或MarkDown格式。
smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写注释,smart-doc就能帮你生成一个简易明了的Markdown、HTML5、Postman Collection2.0+、OpenAPI 3.0+的文档。
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API, 它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统, 例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据, 配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。
简单地说,actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器, 将 actuator 采集到的数据适合给各种监控工具。
Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。
计量器Meter用来收集不同类型的性能指标信息,Micrometer 提供了如下几种不同类型的计量器:
Prometheus 里面也有一些关键性的概念,理解这些概念有利于我们后续更深入的学习。
Prometheus 其实就是一个数据监控解决方案,它能帮你简单快速地搭建起一套可视化的监控系统。但这么说还是有点抽象, 下面我举几个简单的例子,帮助大家理解 Prometheus 究竟能做什么?
对于运维人员来说,他们需要监控机器的 CPU、内存、硬盘的使用情况,以此来保证运行在机器上的应用的稳定性。
对于研发人员来说,他们关注某个异常指标的变化情况,从而来保证业务的稳定运行。
对于产品或运营来说,他们更关心产品层面的事情,例如:某个活动参加人数的增长情况,活动积分的发放情况。
对于上面说到的这些功能,Prometheus 都能够实现。Prometheus 能根据这些收集的数据实现告警功能。
例如:运维希望在 CPU 达到 80% 的时候给值班的运维人员发送邮件,产品希望活动积分发放数量超过 10 万的时候发送告警邮件。 这些都可以通过 Prometheus 实现。
除了数据收集、告警功能之外,Prometheus 还有很多强大的功能,例如:强大的 ProQL 查询、许多客户端库等。
Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。 它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。 同时它还有报警功能,可以在系统出现问题时通知你。
这个是它的主界面:
Grafana 不对数据源作假设,它支持以下各种数据,也就是说如果你的数据源是以下任意一种,它都可以帮助生成仪表。 同时在市面上,如果 Grafana 称第二,那么应该没有敢称第一的仪表可视化工具了。因此,如果你搞定了 Grafana, 它几乎是一个会陪伴你到各个公司的一件称心应手的兵器。
Grafana 支持的数据源:Prometheus、Graphite、OpenTSDB、InfluxDB、MySQL/PostgreSQL、 Microsoft SQL Server、等等。
Expect 是一个可以通过脚本和其它交互程序通信的程序,也可以直接被用于C或C++。
可以实现什么?
安装:yum install expect
本篇通过一个自动远程登录脚本来演示expect的使用。
作为一名开发者,是否经常抱怨环境问题,某个bug只出现在你的环境下面,找了很久才找到原来是一个很小的环境差异导致。 Vagrant可以非常容易的配置一个统一的可复制、可移植的分布式开发环境, 在VirtualBox、VMware、AWS或其他provider平台上, 借助provisioning工具, 比如shell脚本、Ansible、Chef等自动在各个机器上面安装和配置好软件。
只需要一个Vagrantfile,别人就能基于它创建统一的环境,不管你的工作机器是Linux、Mac OS 还是Windows系统, 最后创建的虚拟机环境都是一样的。官网:https://www.vagrantup.com/