通过代码直接设置Java的DNS - Java Dns Cache Manipulator 通过代码直接设置Java的DNS(实际上设置的是DNS

Cache),支持JDK 6+。

通过代码直接设置Java的DNS - Java Dns Cache Manipulator 功能 设置/重置DNS(不会再去Lookup DNS)

可以设置单条 或是通过Properties文件批量设置 查看DNS Cache内容 删除一条DNS Cache(即重新Lookup DNS) 清空DNS

Cache(即所有的域名重新Lookup DNS) 通过代码直接设置Java的DNS - Java Dns Cache Manipulator 需求场景

一些库中写死了连接域名,需要通过修改host文件绑定才能做测试。结果是:

自动持续集成的机器上一般同学是没有权限去修改host文件的,导致项目不能持续集成。

实际上是因为这点,催生这个库的需求。 通过代码直接设置Java的DNS - Java Dns Cache

Manipulator通过代码直接设置Java的DNS - Java Dns Cache Manipulator

单元测试需要每个开发都在开发机上做绑定,增加了依赖的配置操作且繁琐重复。 Java的DNS缺省是不会失效的。

如果域名绑定的IP变了,可以通过这个库重置DNS,作为一个临时的手段(强烈不推荐)。

当然往往进行要先有能执行入口,比如远程调用或是jvm-ssh-groovy-shell。 通过代码直接设置Java的DNS - Java Dns

Cache Manipulator User Guide

通过类DnsCacheManipulator设置DNS。

使用方式如下:

在ClassPath上,提供文件dns-cache.properties:

# 配置格式: # =

然后通过下面的一行代码完成批量设置:

DnsCacheManipulator.loadDnsCacheConfig();

在单元测试中,往往会写在测试类的setUp方法中,如:

@BeforeClass public void beforeClass() throws Exception {

DnsCacheManipulator.loadDnsCacheConfig();

}

更多详细功能参见类DnsCacheManipulator的文档说明。

通过代码直接设置Java的DNS - Java Dns Cache Manipulator Java API Docs

Java API文档地址:

http://alibaba.github.io/java-dns-cache-manipulator/apidocs

通过代码直接设置Java的DNS - Java Dns Cache Manipulator 依赖

Maven示例:

com.alibaba

dns-cache-manipulator

1.0.0

可以在search.maven.org查看可用的版本。

通过代码直接设置Java的DNS - Java Dns Cache Manipulator Developer Guide 如何修改JVM的DNS

Cache

JVM的DNS Cache维护在类InetAddress的addressCache私有字段中,通过反射来修改,

具体参见InetAddressCacheUtil。

注意修改JVM的DNS Cache的线程安全问题

JVM的DNS Cache显然是全局共用的,所以修改需要同步以保证没有并发问题。

通过查看类InetAddress的实现可以确定:通过以addressCache字段为锁的synchronized块来保证线程安全。

其中关键代码(JDK 7)如下:

/* * Cache the given hostname and addresses.

*/ private static void cacheAddresses(String hostname, InetAddress[]

addresses, boolean success) {

hostname = hostname.toLowerCase(); synchronized (addressCache) {

cacheInitIfNeeded(); if (success) {

addressCache.put(hostname, addresses);

} else {

negativeCache.put(hostname, addresses);

}

}

}

InetAddressCacheUtil类中对DNS

Cache的读写也一致地加了以addressCache为锁的synchronized块,以保证线程安全。

相关资料 tanhaichao的javahost项目, 该项目的使用文档。

本项目如何设置Java DNS Cache的解法来自该项目。刚开始在持续集成项目中碰到host绑定的问题时,也是使用该项目来解决的

java的垃圾收集机制

既然,我们已经了解到了何为“JVM”,那么我们也要接着了解一下,JVM是如何进行平时的内存分配的?

过去的语言(如C语言)要求程序员显示的分配内存、释放内存。程序在需要时分配内存,不需

要时释放内存。但是这种做法常常会引起“ 内存泄漏”,

即是说,由于某种原因是分配的内存始终没有得到释放。如果该任务不断地重复,程序最终会耗尽内存并异常终止,至少无法正常的运行下去。相比之下,java

不要求程序员显式的分配内存和释放内存,避免了很多的潜在问题。

java在创建对象时自动分配内存,并当该对象的引用不存在是释放这块内存。 而这也就是,java垃圾回收机制,java相对于以前的语言的优势。

java的垃圾收集机制,gc(garbage

collection),是指JVM用于释放哪些不在会用的对象所占用的内存。,虽说,java语言并没有要求JVM有gc,也没有规定gc要如何进行工

作,但是,常用的JVM都有GC,而且,大多数gc都使用类似的算法管理内存,和执行收集操作。 但是一般的,在java语言之中,判断一块内存空间是否符合

垃圾回收器标准的标准只有两个:

(1)给对象赋予了控制null,以后再没有调试过。

(2)给对象赋予了新值,即重新分配了内存空间。 注:一块内存空间符合了垃圾回收器的收集标准,并不意味着这块内存控件就一定会被垃圾回收器收集。

虽说,java是自动进行内存的分配与释放的。但是,我们也可以使用System.gc()方法做到强制执行。

但是,并不保证每次调用

System.gc()方法就一定能够启动垃圾回收,他只不过会向jvm发出这样的一个申请,但是当地会不会真正执行垃圾回收,一切都是未知数。

所以,我们可以在执行system.gc()前,先执行finalize()方法,对对象进行强制释放内存。虽说,在没有明确释放内存志愿的情况下,java也会隐形的调用finalize()方法,终止对象,以此来释放资源。

详解Java GC的工作原理:

1、 首先来看一下JVM内存结构,它是由堆、栈等部分组成

1)堆

所有通过new创建的对象的内存都在堆中分配。显然,如果不对堆中的这些对象内存进行分类的话,是多而杂的。在不进行对象存活时间区分的情况下,每次垃圾

回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果

的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最

适合它的垃圾回收方式进行回收。

年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个

Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个

Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制

过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时

存在从Eden复制过来

对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空

的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

年老代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate

等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设 置。

2)栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

2. JVM垃圾回收机制

针对上述的分类,GC有两种类型:Scavenge GC和Full GC。

1)Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge

GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对

年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因

而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

2)Full GC 对整个堆进行整理,包括Young、Tenured和Perm。因为需要对整个块进行回收,所以比Scavenge

GC要慢,因此应该尽可能减少Full GC的次数。 在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

(1) 年老代(Tenured)被写满

(2)持久代(Perm)被写满

(3)System.gc()被显示调用

(4)上一次GC之后Heap的各域分配策略动态变化

java 设置dns_通过代码直接设置Java的DNS - Java Dns Cache Manipulator相关推荐

  1. java 电池类类代码举例_教案:Java第7章 类的方法

    授课教师:牟勇 课时:100分钟 l 本章技能目标 n 会定义和使用类的方法 n 理解变量作用域 n 会创建包组织Java工程 n 会添加类方法的JavaDoc注释 n 会阅读JavaSE6文档 l ...

  2. java 设置mime type_将Mimetype添加到MimetypesFileTypeMap - java

    我在将Mimetypes添加到MimetypesFileTypeMap时遇到问题.我已经尝试添加META-INF / mime.types文件,就像Documentation所说的那样.但Mimety ...

  3. java二进制转十进制代码_二进制转十进制java代码

    二进制转十进制java代码 Java有两种方法可以将二进制数转换为十进制数: 1)使用Integer类的Integer.parseInt()方法. 2)自己编写转换逻辑. 方法1:使用Integer. ...

  4. java音频播放器代码_谁可以用Java编写音频或视频播放器的代码. 您可以运行实现....

    全部展开 你好房东,你可以试试这个 import javax.media.ControllerEvent; import javax.media.ControllerListener; import ...

  5. java登录注册升级代码_【升级版】Java 登录,注册,传数据到后台小案例

    1.项目结构 2.项目所用文件 1)jar包  ojdbc5.jar     2)js     jquery-2.1.0.js , jquery.validate.min.js       3)css ...

  6. Java设置环境变量的作用和意义

    Java设置环境变量的作用和原因 在java 中需要设置三个环境变量(1.5之后不用再设置classpath了,但建议继续设置以保证向下兼用问题) JDK安装完成之后我们来设置环境变量:右击" ...

  7. java sheet 打印区域设定,如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)...

    如何使用Java设置电子表格的打印区域.(How to set the print area of a spreadsheet using Java.) 问题描述 (Problem Descripti ...

  8. Java冒泡算法和代码详述

    Java冒泡算法和代码详述 冒泡排序算法是Java排序算法中最基本,也是最有名的算法之一 代码分为两层循环,外层冒泡轮数,里层依次比较 代码说明: package arrays;import java ...

  9. java寻找最大的字母_【LeetCode(Java) - 744】寻找比目标字母大的最小字母

    [LeetCode(Java) - 744]寻找比目标字母大的最小字母 [LeetCode(Java) - 744]寻找比目标字母大的最小字母 文章目录 1.题目描述 2.解题思路 3.解题代码 1. ...

最新文章

  1. 再测Golang的JSON库
  2. 30百度人撑起自动驾驶半壁江山
  3. wordpress 后台,登录,注册开启https的重写规则
  4. mybatis中传入String类型参数异常
  5. php 阻塞消息队列,linux 消息队列阻塞
  6. ICCV 2019 | 通过多标签相关性研究提升神经网络视频分类能力
  7. Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...
  8. ASP.NET MVC3 学习心得------路由机制
  9. N - Dragon Balls(并查集+深度的意义
  10. 第一款Micropython图形化编辑器—Python Editor
  11. 用vertx compose写链式操作
  12. asp.net执行js出现“已终止操作”的解决方法
  13. ABP中module-zero快速集成微信用户认证
  14. 微信小程序选择市,区县
  15. springboot内置浏览器_SpringBoot启动后启动内嵌浏览器的方法
  16. bat脚本注释多行_批处理中的行,段注释
  17. 基于ZFC公理系统的无穷小微积分学
  18. ZohoCRM客户管理系统应用的案例分享
  19. 视频教程-太空大战游戏实战课程-其他
  20. LED小间距屏幕理解

热门文章

  1. 服务器 1 500错误信息,什么是500错误
  2. Cricuit Switched Fallback (CSFB) : UTRAN Overview
  3. cap文件类型的数据包结构分析
  4. idea移动一行或一个方法的快捷键
  5. SVR,时间序列分析的评价指标,python数据标准化
  6. vi VS vim编辑器【有待完善】
  7. pfsense修改密码的两个方法
  8. python(2)--nowcoder
  9. centos7 安装keepalived
  10. 笔记:推挽输出、开漏输出