Day5-1 postJson、锁监控、线程安全、JVisualVM工具和JAVA内存模型

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的代码块执行完毕后自动释放该锁,后者才能申请成功。

通常有很多框架提供相同的功能的多个对象,主要实现保证安全(加锁降低并发)和保证性能(无锁降低安全)两种需求,例如:


 

有锁无锁
VectorArrayList
HashTable

HashMap

StringBufferStringBuilder

实现方式:使用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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值