java

JVM垃圾回收器

JVM回收器概述 垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、分代算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚拟机中的垃圾收集器。 垃圾收集器组合 图中展示了7种不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1; 而它们所处区域,则表明其是属于新生代收集器还是老年代收集器: 新生代收集器:Serial、ParNew、Parallel Scavenge; 老年代收集器:Serial Old、Parallel

  • 凯文
22 min read
network

数据包是如何在网络中传输的

我们电脑上的数据,是如何“走”到远端的另一台电脑的呢?这是个最基础的问题,可能很多人回答不上来,尽管我们每天都在使用网络。这里我们以一个最简单的“ping”命令,来解释一个数据包“旅程”。 假设:我的电脑A,向远在外地的朋友电脑B传输数据,最简单的就是“ping”一下,看看这个家伙的那一端网络通不通。A与B之间只有一台路由器。(路由器可能放在学校,社区或者电信机房,无所谓,基本原理是一样的) 具体过程如下------ 1.“ping”命令所产生的数据包,我们归类为ICMP协议。说白了就是向目的地发送一个数据包,然后等待回应,如果回应正常则目的地的网络就是通的。当我们输入了“

  • network
5 min read
linux

ioctl函数详解

概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 用户空间 ioctl #include <sys/ioctl.h> int ioctl(int

  • network
7 min read
java

java垃圾回收算法

标记-清除算法 算法概述 分为标记和清除两个阶段:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象;是最基础的收集算法,其它的收集算法都是基于这种思路并对其不足进行改进而得到的。 不足 效率问题,标记和清除两个过程的效率都不高; 空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续内存二不得不提前触发另一次垃圾收集动作。 复制算法 算法概述 为了解决效率问题,复制收集算法出现了,他将可用的内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉 不足 这种算法的代价是将内存缩小为原来的一般,代价太高 用途 存活区采用这种算法。因为新生代中的对象98%是“朝生夕死”,所以并不需要按照1:1的比例来划分内存空间,

  • developer
3 min read
linux

iptables介绍

iptables之snat与dnat dnat-目的网络地址转换 dnat是用来做目的网络地址转换的,就是重写包的目的IP地址。如果一个包被匹配了,那么和它属于同一个流的所有的包都会被自动转换,然后就可以被路由到正确的主机或网络。比如,你的Web服务器在LAN内部,而且没有可在Internet上使用的真实IP地址,那就可以使用这个dnat让防火墙把所有到它自己HTTP端口的包转发给LAN内部真正的Web服务器。目的地址也可以是一个范围,这样的话,DNAT会为每次请求随机分配一个机器,这样我们可以用这个dnat做负载平衡。 [root@linux ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp\ --dst 122.225.97.111 --dport 80

  • network
8 min read
java

jvm之Unsafe.CAS

CAS概述 Unsafe 是 java 留给开发者的后门,用于直接操作系统内存且不受 jvm 管辖,实现类似 C++ 风格的操作。 Oracle 官方一般不建议开发者使用 Unsafe 类,因为正如这个类的类名一样,它并不安全,使用不当会造成内存泄露。 在平时的业务开发中,这个类基本是不会有接触到的,但是在 java 的并发包和众多偏向底层的框架中,都有大量应用。 值得一提的是,该类的大部分方法均为 native 修饰,即为直接调用的其它语言(大多为 C++)编写的方法来进行操作,很多细节无法追溯,

  • developer
2 min read
java

JDK动态代理与Cglib动态代理

Cglib与JDK动态代理的区别 JDK代理只能针对实现了接口的类以反射的方式生成代理,而不能针对类 CGLIB是针对类实现代理的,主要对指定的类以字节码转换的方式(ASM框架)生成一个子类,并重写其中的方法。    因为是创建目标类的子类,所以目标类必须要有无参构造函数(子类的有参构造函数会调用父类无参),否则报错 另外因为是继承,所以我们的目标类最好不要使用Final声明 Spring如何切换不同的代理 1、如果目标对象实现了接口,默认会采用JDK的动态代理机制实现AOP,但是可以强制使用CGLIB实现AOP ;     缺点:必须实现接口,并且生成的代理对象也只能声明成为其中一个接口,其他接口的方法和自己的方法访问不到。 2、如果目标对象没有实现接口,必须使用CGLIB生成代理,spring会自动在CGLIB和JDK动态代理之间切换 。 通过注解 @EnableAspectJAutoProxy(proxyTargetClass=true, exposeProxy=true)

  • developer
4 min read
java

7. jvm之io之字符流与字节流总括

1、Java IO 流 io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。 2、流的分类 输入流、输出流 A、输入流:只能从中读取数据,而不能向里面写数据 B、 输出流:只能向里面写数据,而不能读数据 可以这样理解,数据从内存到硬盘,通常认为是输出流,即写操作;相反,从硬盘到内存,通常认为是输入流,即读操作;这里的输入、输出是从内存的角度划分的。 Java的输入流主要有InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类;

  • developer
4 min read
java

18. jvm之关键字

transient:实现Serilizable接口,接口的类均可被实例化,若类的属性以transient标识,则序列化对象的时候,这个属性就不会序列化到指定的目的地中。 native: 调用原生的c语言代码 (4. jvm之native方法和JNI基础中有详细说明) instanceof: instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。 public static void test(Inter t){   System.err.println(t instanceof InterImpl);   } 注:类 InterImpl必须为Inter的子类(也可以是Inter及其父类,但是对象肯定是Inter及其父类的对象,所以无意义) volatile: http:

  • developer
1 min read
java

17. JVM之性能调优工具

jmap 命令介绍 得到运行java程序的内存分配的详细情况。例如实例个数,大小等 格式 jmap [ option ] pid pid为java进程号 -dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. -finalizerinfo 打印正等候回收的对象的信息. -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况. -histo[:live] 打印每个class的实例数目,

  • developer
8 min read
java

16. jvm之数组

基本数据类型的数组无法自动封装为对象数据类型的数组 数组同样可获取到class对象,通过is.getClass().isArray()判断是否为数组 如果为数组,需要通过args instanceof Object[] 或者 args instanceof int[] 判断是哪种数据类型的数组,之后再进行转换,否则会转换异常 数组包括基本数据类型的数组均通过Object(注意非Object [])入参接收,确定该数组的数据类型后,可转为该类型的数组 Arrays的asList方法只对数据类型为对象类型的数组有效,基本数据类型的数组无效;基本数据类型调用该方法时,会把整个数组当作object放入list中返回 数组的打印结果为[Ljava.lang.String;@5387f9e0,L数组类型;@地址

  • developer
3 min read
java

13. jvm之动态代理

java的动态代理机制详解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾。 在java的动态代理机制中,有两个重要的类或接口,一个是接口InvocationHandler、另一个则是类 Proxy,这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: InvocationHandler is the interface implemented by the invocation handler of a proxy instance.

  • developer
8 min read
java

11.1. 注解无法通过反射获取到的原因

clazz.getAnnotation(annoClazz); clazz.isAnnotationPresent(annoClazz); 以上代码无法获取到注解,分析原因如下 注解上是否添加了Retention注解,并且value值为RetentionPolicy.RUNTIME Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值: RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略 RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略 RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用. 确保加载注解注释类与注解类的classloader一致,因为判断是否是一个类的标准中包含是否是同一classloader加载的

  • developer
1 min read