Java的PermGen永久代去哪儿了?
Java虚拟机(JVM)使用其类的内部表示形式,其中包含每个类的元数据,如类层次结构信息、方法数据和信息(如字节码、堆栈和变量大小)、运行时常量池以及解析的符号引用和Vtables。 在过去(当自定义类装入器不那么常见的时候),类大多是“静态”的,很少被卸载或收集,因此被标记为“永久”。另外,由于类是JVM实现的一部分,而不是由应用程序创建的,因此它们被视为“非堆”内存。 对于JDK8之前的hot
Java虚拟机(JVM)使用其类的内部表示形式,其中包含每个类的元数据,如类层次结构信息、方法数据和信息(如字节码、堆栈和变量大小)、运行时常量池以及解析的符号引用和Vtables。 在过去(当自定义类装入器不那么常见的时候),类大多是“静态”的,很少被卸载或收集,因此被标记为“永久”。另外,由于类是JVM实现的一部分,而不是由应用程序创建的,因此它们被视为“非堆”内存。 对于JDK8之前的hot
在编译时不知道类的情况下,从Java类读取getter的最快方法是什么?Java框架经常这样做——很多。而且,它可以直接影响他们的表现。所以,让我们对不同的方法进行基准测试,比如反射、方法句柄和代码生成。 反射用例 假设我们有一个简单的Person类,它有一个名称和地址: public class Person { ... public String getName() {...} public
Apache Tomcat是由Apache软件基金会(ASF)开发的开源web服务器和servlet容器。Tomcat实现了几个javaee规范,包括javaservlet、javaserverpages(JSP)、javael和WebSocket,并为Java代码提供了一个“纯Java”的httpweb服务器环境。 Tomcat的架构 Tomcat的体系结构由一系列功能组件组成,这些组件可以根据
Spring5于2017年9月发布,正式发布(GA),标志着自2013年12月以来的第一个主要Spring框架发布。它提供了期待已久的改进,并采用了一种新的编程范式,该范式基于反应性宣言中提出的反应性原则。 这个版本是Spring框架长期以来最激动人心的版本。与Java兼容™ spring5集成了jdk8和jdk9,为端点和web应用程序开发提供了一种改变游戏规则的方法。 事实上,反应式编程是本次
Class Loaders简介 Class Loaders类加载器负责在运行时将Java类动态加载到JVM(Java虚拟机)。此外,它们也是JRE(Java运行时环境)的一部分。因此,由于类加载器的存在,JVM不需要知道底层文件或文件系统就可以运行Java程序。 此外,这些Java类不会一次全部加载到内存中,而是在应用程序需要时加载。这就是类装入器出现的地方。它们负责将类加载到内存中。 在本文中,
在Java8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java8允许接口具有默认和静态方法。我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类。 为什么选择默认方法? 例如,如果A、B、C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInterface添加一个新方法,我们必须更改实现该接口的所
用更少的代码编写 JSON 单元测试。非常适合测试 REST 接口。 像比较字符串一样编写 JSON 测试。JSONassert 将您的字符串转换为 JSON 对象,并将逻辑结构和数据与实际的 JSON 进行比较。当strict设置为 false(推荐)时,它允许重新排序数据和扩展结果(只要所有预期的元素都存在),从而使测试不那么脆弱。 支持的测试框架:JUnit 代码示例 在 JSONasser
递归数据结构(结构递归) 递归在计算机科学中的一个重要应用是定义列表和树等动态数据结构。递归数据结构可以根据运行时需求动态地增长到理论上无限大的大小;相反,静态数组的大小必须在编译时设置。 当以递归的方式定义基础问题或待处理的数据时,递归算法特别适用。 本节中的示例说明了所谓的“结构递归”。这个术语指的是递归过程作用于递归定义的数据。 只要程序员从数据定义中派生模板,函数就采用结构递归。也就是说,
1. 概述 Java9在包之上引入了一个新的抽象级别,正式称为Java平台模块系统(JPMS),简称“模块”。 在本文中,我们将介绍新系统并讨论其各个方面。 2. 什么是模块? 首先,我们需要先了解模块是什么,然后才能了解如何使用它们。 模块是一组密切相关的包和资源以及一个新的模块描述符文件。 换句话说,它是一个“Java包的包”的抽象,允许我们使代码更加可重用。 2.1 Packages 模块中
在深入了解Tomcat服务器中配置文件的含义之前,我们可以访问另一篇关于为javaweb配置Tomcat的文章。 我们开始吧。 启动、停止和重新启动Tomcat 为了启动、停止和重新启动Tomcat,我们需要访问Tomcat的bin目录。脚本文件可以用.sh(Unix的shell脚本文件)和.bat(Windows的批处理文件)终止。 下表描述了我们需要知道的bin目录中每个文件的含
在本文中,我们将讨论Java Instrumentation API。它提供了向现有编译的Java类添加字节码的能力。 我们还将讨论java代理以及如何使用它们为代码提供工具。 我们将使用工具构建一个应用程序。 我们的应用程序将包括两个模块: 1. 允许我们取款的ATM应用程序 2. 还有一个Java代理,它允许我们通过测量投入的时间和花费的金钱来测量ATM的性能 Java agent将修改ATM
GraphQL是来自Facebook的一个相对较新的概念,被宣传为RESTforWebAPI的替代品。 本文将介绍如何使用Spring Boot设置GraphQL服务器,以便将其添加到现有应用程序或用于新应用程序。 什么是GraphQL? 传统的RESTAPI使用服务器管理的资源概念。这些资源可以按照各种HTTP谓词以一些标准方式进行操作。只要我们的API符合资源概念,它就可以很好地工作,但当我们
OpenJDK是Java的开发工具包,Java有着26年的历史。从任何标准来看,它都不是一种新的语言,尤其是在行业中,每隔几年就会出现新的解决方案,而且通常比以前的解决方案更好。而最流行的Java实例OpenJDK已经有14年的历史了。无论如何,OpenJDK应该已经被替换了很多次了。但它仍然是世界上最流行的开发工具之一!这怎么会发生? 在本文中,我们将尝试回答这个问题,深入研究OpenJDK的不
当我们需要在Java中查找或替换字符串中的值时,我们通常使用正则表达式。这使我们能够确定字符串的部分或全部是否与模式匹配。使用Matcher和string中的replaceAll方法,我们可以很容易地将相同的替换应用于字符串中的多个标记。 在本文中,我们将探讨如何为字符串中的每个token标记应用不同的替换。 我们还将研究一些调整正则表达式以正确识别标记的技巧。 在我们能够构建标记替换算法之前,我
在平时开发中经常会遇到需要调用接口和外部服务的场景,但是有些接口服务方不能立即返回数据,而是需要处理一段时间才能返回真实的业务数据,如果没有处理完则直接返回一个中间状态的结果。 业务场景: 代码中存在依赖不稳定的场景,需要使用重试获取预期结果或者尝试重新执行逻辑不立即结束,比如远程接口访问,数据加载访问,数据上传校验等 对于异常需要重试的场景,同时希望把正常逻辑和重试逻辑解耦 对方接口不支持异步回
反射是一个API,用于在运行时检查或修改方法、类、接口的行为。 下面提供了反射所需的类java.lang.reflect包裹。 反射为我们提供了一个对象所属的类的信息,以及可以使用该对象执行的类的方法的信息。 通过反射,我们可以在运行时调用方法,而不管它们使用的访问说明符是什么。 反射可用于获取有关: 类Class getClass()方法用于获取对象所属类的名称。 构造函数Constructor
Java开发工具包(javadevelopmentkit,JDK)正式命名为“Java平台标准版”或“javase”,用于编写Java程序。JDK可以从sun microsystems(现在是Oracle的一部分)免费获得。JDK(javase)的母站点是http://www.oracle.com/technetwork/java/javase/overview/index.html。 “JDK”
当java8的第一个早期access版本出现时,最重要的演变似乎是lambdas。这一点现在正在改变,许多开发人员现在似乎认为流是最有价值的Java8特性。这是因为他们相信通过改变程序中的一个单词(用parallelStream替换stream),他们将使这些程序并行工作。许多Java8的传道者已经展示了这方面的惊人例子。这有什么问题吗?不,不是什么。很多事情: 并行运行可能是一个好处,也可能不是
Java代理Agents通过提供使我们能够侵入JVM中正在运行的Java程序的服务,在最底层工作。Java的这一强大但不可思议的部分具有在错误操作时使JVM崩溃的能力。本文简要介绍了这个概念,并介绍了它的工作原理。 表示Java Agents的类显然只不过是Java API库中的任何其他类。但是,让它们与众不同的是,它们遵循某种约定,这种约定使Java代码能够拦截JVM中运行的另一个应用程序。其目
Java Dumps是在虚拟机由于网络问题、内存错误或用户启动任何类型的按键组合而意外停止时错误创建的一些Java内核。通过调用合并到应用程序源代码中的Java转储API或通过命令行直接提供-Xdump:Java选项,可以轻松创建Java Dumps。Java Dumps通过提供一些有用的信息来帮助最终用户排除故障,并诊断当应用程序意外停止运行时发生的停止的根本原因。 语法 Java