分类目录归档:Java

GC


VM 参数

项目 参数
堆初始大小 -Xms
堆最大大小 -Xmx 或 -XX:MaxHeapSize=size
新生代大小 Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size )
幸存区比例(动态) -XX:InitialSurvivorRatio=ratio 和 -XX:+UseAdaptiveSizePolicy
幸存区比例 -XX:SurvivorRatio=ratio
晋升阈值 -XX:MaxTenuringThreshold=threshold
晋升详情 -XX:+PrintTenuringDistribu

Read more

深入理解 Java 虚拟机 读书笔记


本章是第二部分的第1章,笔者将从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作 用、服务对象以及其中可能产生的问题,这也是翻越虚拟机内存管理这堵围墙的第一步。

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地 址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。 此内存区域是唯 一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。

每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧1用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕

Read more

在32位的机器上对long型变量进行加减操作并发隐患


常听人说,在32位的机器上对long型变量进行加减操作存在并发隐患,到底是不是这样呢?

非volatile类型的long和double型变量是8字节64位的,32位机器读或写这个变量时得把人家咔嚓分成两个32位操作,可能一个线程读了某个值的高32位,低32位已经被另一个线程改了。所以官方推荐最好把long\double 变量声明为volatile或是同步加锁synchronize以避免并发问题。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7

Read more

Java序列化


RMI中对数据对象的序列化采用的是Java序列化。而目前主流的微服务框架却几乎没有用到Java序列化,SpringCloud用的是Json序列化,Dubbo虽然兼容了Java序列化,但默认使用的是Hessian序列化。

Java序列化的缺陷

1.无法跨语言

2.易被攻击

攻击者可以创建循环对象链,然后将序列化后的对象传输到程序中反序列化,这种情况会导致hashCode方法被调用次数呈次方爆发式增长, 从而引发栈溢出异常。例如下面这个案例就可以很好地说明。

Set root = new HashSet();
Set s1 = root;
Set s2 = new HashSet();
for (

Read more