postJson
当使用post请求并传递json类型的参数时,需要先将json类型的数据封装成StringEntity类型进行传递。
param = "{"count":3}"
org.json.JSONObject json = new org.json.JSONObject(param);
StringEntity entity = new StringEntity(json.toString(), "utf-8");// 解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
post.setEntity(entity);
锁监控
命令行工具:jps命令查看所有java线程,可以得到线程的<pid>
jstack <pid>根据线程号为<pid>的某个线程信息,可以看到是否有死锁
图形化工具:jdk/bin/JConsole.exe监控Java程序的内存、线程和锁等,可用于排查死锁
线程安全
全局变量由多个线程进行读写,容易引发脏读,带来线程安全问题。因此引入锁机制,某线程对公共资源使用synchronized锁定,其它线程同时请求该资源时,需等待,当synchronized的代码块执行完毕后自动释放该锁,后者才能申请成功。
通常有很多框架提供相同的功能的多个对象,主要实现保证安全(加锁降低并发)和保证性能(无锁降低安全)两种需求,例如:
有锁 | 无锁 |
Vector | ArrayList |
HashTable | HashMap |
StringBuffer | StringBuilder |
实现方式:使用synchronized修饰方法来保证线程安全性,例如StringBuffer类的append方法。
JVisualVM工具
该工具比JConsole功能更加强大,JConsole通常只用于监控死锁。
图形化工具:jdk/bin/jvisualvm.exe
可以在工具-插件菜单下面,下载Virsual GC插件。若无法成功下载,网络搜索一个可以连接的插件中心地址,并修改即可
抽样器功能:可以抽样cpu和内存的使用情况,查看哪个线程占用cpu或内存高
JAVA内存模型
JAVA内存:分为堆(Heap)和非堆(Non-heap)内存。简单来说堆就是留给开发人员使用的;非堆就是JVM留给自己用的。
Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同。
JVM不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。因此jvm 设计了 分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation,在JDK8以上叫做元空间metaspace)。
年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
垃圾回收算法
CMS 默认算法
[Concurrent Mark Sweep CMS]是一款并发、使用标记-清除算法的gc算法。当主程序稍微空闲或者老年代比较满的时候触发。它是最小停顿,类似保姆,会和主程序抢占cpu。
G1算法
未来可能G1算法,支持更大内存快速回收 64G,采用分区+CMS,即把64G的内存分成32份,每份2G,避免大内存满的时候触发GC大量占用CPU。