web编程 端口分配_以编程方式衡量分配

web编程 端口分配

我从Heinz Kabutz撰写的Java专家通讯中获得了这个技巧。 (对于所有想要了解JDK内容的Java开发人员来说,这是绝对必要的!)

特别是对于编写低延迟代码的开发人员,即使对于普通的Java代码,分配也是您真正要避免的事情。 有关更多详细信息,请参阅我以前的文章“ 优化的第一条规则 ”和“ 重新审视性能优化的第一条规则:逃逸分析的效果 ”。

在本技巧之前,我一直使用分析器来计算分配,或者我想您可以使用对Runtime的调用来查看JVM已分配了多少堆内存。

使用MBean,我们能够查询单个线程的分配情况。 这为我们提供了一种非常精确的方法来测量特定线程是否已分配以及是否分配了多少线程。 在为零分配进行编码的情况下,可以在测试中包含对该代码的调用,断言没有分配。

下面是一个简单的类,您可以根据时事通讯的提示使用它。

您会注意到,构造函数进行了校准,以调整由bean本身创建的分配量。

还有一些防御性代码可确保仅从单个线程调用该类。

您可以调用方法markAllocations来查找自上一个标记以来已分配的字节数。 printAllocations是一种方便的方法,用于打印从最后一个标记到标准输出的分配。 构造类之后,将reset分配分配,调用reset或调用markAllocationsprintAllocations

在测试中,您可能具有以下代码:

Allocations measure = new AllocationsMeasure();
...
//critical code
...
assertEquals(0, measure.markAllocations());

以下是AllocationsMeasure完整代码:

package util;import javax.management.*;
import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;/*** Created by daniel on 06/07/2015.*/
public class AllocationMeasure {private final String GET_THREAD_ALLOCATED_BYTES = "getThreadAllocatedBytes";private final String[] SIGNATURE = new String[]{long.class.getName()};private final String threadName = Thread.currentThread().getName();private final Object[] PARAMS = new Object[]{Thread.currentThread().getId()};private MBeanServer mBeanServer;private ObjectName name = null;private AtomicLong allocated = new AtomicLong();private long BYTES_USED_TO_MEASURE = 336;private long tid;public AllocationMeasure(){tid = Thread.currentThread().getId();try {name = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);mBeanServer = ManagementFactory.getPlatformMBeanServer();} catch (MalformedObjectNameException e) {e.printStackTrace();}//calibratefor (int i = 0; i < 100; i++) {//run a few loops to allow for startup anomaliesmarkAllocations();}long callibrate = threadAllocatedBytes();BYTES_USED_TO_MEASURE = threadAllocatedBytes()-callibrate;reset();}public void reset(){if(tid != Thread.currentThread().getId())throw new AssertionError("AllocationMeasure must not be used over more than 1 thread.");allocated.set(threadAllocatedBytes());}private long threadAllocatedBytes() {try {return (long)mBeanServer.invoke(name,GET_THREAD_ALLOCATED_BYTES,PARAMS,SIGNATURE);} catch (Exception e) {throw new IllegalArgumentException(e);}}public long markAllocations() {if(tid != Thread.currentThread().getId())throw new AssertionError("AllocationMeasure must not be used over more than 1 thread.");long mark1 = ((threadAllocatedBytes()-BYTES_USED_TO_MEASURE) - allocated.get());allocated.set(threadAllocatedBytes());return mark1;}public void printAllocations(CharSequence marker) {if(tid != Thread.currentThread().getId())throw new AssertionError("AllocationMeasure must not be used over more than 1 thread.");long mark1 = ((threadAllocatedBytes()-BYTES_USED_TO_MEASURE) - allocated.get());System.out.println(threadName + " allocated " + marker + ":" + mark1);allocated.set(threadAllocatedBytes());}public static void main(String[] args) {String TEST = "Test";AllocationMeasure allocationMeasure = new AllocationMeasure();for (int i = 0; i < 1000; i++) {allocationMeasure.reset();//allocationMeasure = new AllocationMeasure();long mark1 = allocationMeasure.markAllocations();if(mark1 >0 )System.out.println("m1:" + mark1);}allocationMeasure.printAllocations(TEST);}
}

翻译自: https://www.javacodegeeks.com/2015/07/measuring-allocations-programmatically.html

web编程 端口分配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++—vector的使用

点击蓝字关注我们一、vector的介绍说的简单点&#xff1a;vector是可以动态增长的数组容器vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。…

python词频统计完整步骤_Python中文文本分词、词频统计、词云绘制

本文主要从中文文本分词、词频统计、词云绘制方面介绍Python中文文本分词的使用。会使用到的中文文本处理包包括&#xff1a;wordcloud,jieba&#xff0c;re&#xff08;正则表达式&#xff09;,collections。 1 准备工作 导入相关的包&#xff0c;读取相关数据。 #导入包 impo…

现代 C++ 测试工具链

点击蓝字关注我们gtest的问题gtest需要安装有时候带来很多不方便&#xff0c;比如需要经常切换gcc和clang的时候就比较麻烦&#xff0c;安装的gtest可能在另一个编译器下编译不过, 编写跨平台程序的时候需要多次安装gtest&#xff0c;非常不便。另外一个问题是网络原因&#xf…

数据结构压缩_将数据压缩到数据结构中

数据结构压缩这个故事是关于我们最近在Plumbr进行的容量优化任务。 一切始于将无害的要求添加到现有组合中。 您可能知道&#xff0c;Plumbr监视解决方案作为连接到服务器的Java代理分发。 只需少量添加即可跟踪一段时间内所有已连接的代理&#xff0c;以便可以实时回答以下问…

python打开软件输入消息_用Python编写一个私人助理程序,为我们起草电子邮件!...

在你的工作中是否有一些你自己经常做重复的任务?这就是编程的乐趣所在。通过一些思考和编程&#xff0c;您可以使您的任务自动化&#xff0c;并为您节省大量时间。在本文中&#xff0c;我们将介绍一些Python工具和技巧&#xff0c;让你可以创建自己的Python个人助理。1. 助手功…

swing 状态视图分离_Java Swing模型视图适配器介体

swing 状态视图分离通常&#xff0c;我基于Spring Framework构建Java应用程序。 但是&#xff0c;最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序&#xff0c;因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续学习&…

超级炫酷的C语言技巧!

点击蓝字关注我们C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单&#xff0c;并且仍然有一些非常有用的语法技巧和功能&#xff0c;只是没有多少人知道罢了。一、指定的初始化很多人都知道像这样来静态地初始化数…

webgl 基础渲染demo_WebGL + ThreeJS 实现实时水下焦散 Part 1

知乎视频​www.zhihu.com采用 WebGL 和 ThreeJS 运行实时焦散运算&#xff0c;需要一点相关基础。本文主要介绍焦散的原理以及计算方法原作者https://github.com/martinRenou​github.com代码和原文https://github.com/martinRenou/threejs-caustics​github.com由于本人的笔电…

python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间

我正在编写一个简单的应用程序&#xff0c;它将大文本文件拆分为较小的文件&#xff0c;并且我已经编写了2个版本&#xff0c;一个使用列表&#xff0c;另一个使用生成器。我使用memory_profiler模块对这两个版本进行了概要分析&#xff0c;并清楚地显示了生成器版本的更好的内…

超硬核C++BestPractices翻译与阅读笔记

点击蓝字关注我们硬货开始这本书的副标题是&#xff1a;45ish Simple Rules with Specific Action items for better C ,这本书是由大佬推荐的&#xff0c; C学习有必要掌握一下这45条最佳实践&#xff0c; 可以很大程度上提升代码的可读性和健壮性&#xff0c; 而且这本书也不…

redis集成spring_将Redis集成到您的Spring项目中

redis集成spring本文介绍如何通过注释配置将Redis缓存集成到您的spring项目中。 我们将从Gradle配置开始。 我们将使用jedis驱动程序。 group com.gkatzioura.spring version 1.0-SNAPSHOTapply plugin: java apply plugin: eclipse apply plugin: idea apply plugin: spring…

Python3实现翻转二叉树问题

Python3实现翻转二叉树问题翻转一棵二叉树。# 二叉树的结构如下 class TreeNode:def __init__(self, x):self.val xself.left Noneself.right None# 解决方案 class Solution:# 从根节点开始递归翻转其左子树和右子树def invertTree(self, root: TreeNode) -> TreeNode:i…

diskgenius单文件专业版_金蝶KIS专业版系列——系统工具六(业务套打工具)

导读&#xff1a;&#xff08;一&#xff09;问一问1.1.套打的作用1.2.举例&#xff08;二&#xff09;怎么进入套打设计器2.1.入口12.2.入口2&#xff08;三&#xff09;怎么使用套打设计器打开套打模板3.1.打开系统标准套打模板3.2.新建一个空白的套打模板3.3.保存套打模板3.…

面试常问的16个C语言问题,你全会吗?

点击蓝字关注我们金三银四不少小伙伴在找工作&#xff0c;这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题&#xff0c;你看看能做到全会吗&#xff1f;1、用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09…

高性能 高可用 可弹性伸缩_性能,可伸缩性和活力

高性能 高可用 可弹性伸缩本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01;…

Python3实现32位整数翻转

Python3实现32位整数翻转给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123 输出: 321示例 2: 输入: -123 输出: -321示例 3: 输入: 120 输出: 21假设我们的环境只能存储得下 32 位的有符号整数&#xff0c;则其数值范围为 […

iptables命令_程序员最有用的linux命令汇总

总结程序员在工作中&#xff0c;最有用的linux命令如下&#xff1a;1、vi/vim 我们须要在服务器上代码一些代码时候&#xff0c;就用vi/vim命令就可以&#xff0c;vim是vi的升级&#xff0c;本色自带代码高亮工具&#xff0c;利于查看。dd 删除光标所在行o 向光标所在行向下增加…

抽象类和接口设计_如何设计类和接口

抽象类和接口设计本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &#xf…

详解C++异常

点击蓝字关注我们1、异常概念异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间接的调用者处理这个错误。throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: …

Python3 反转一个单链表

Python3 反转一个单链表反转一个单链表。示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL解题&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # …