当前位置: 首页 > news >正文

纯静态网站seowordpress 绑定域名

纯静态网站seo,wordpress 绑定域名,wordpress中文完全教程.rar,微信小程序后端开发语言目录 什么是Threadlocal#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal#xff1f; ThreadLocal 是 Java 中的一个类#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…目录 什么是Threadlocal Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal ThreadLocal 是 Java 中的一个类它提供了线程本地变量的支持。线程本地变量是指被线程拥有并独立于其他线程的变量。每个线程都可以独立地改变自己的副本而不会影响其他线程的副本。ThreadLocal 主要用于在多线程环境下保持变量的线程封闭性以实现线程安全。 Threadlocal的基本使用 1. set(T value) 用于设置当前线程的线程本地变量的值。 参数 value 是要设置的值。 ThreadLocalString threadLocal new ThreadLocal(); threadLocal.set(Hello, ThreadLocal!); 2. get() 用于获取当前线程的线程本地变量的值。 ThreadLocalString threadLocal new ThreadLocal(); String value threadLocal.get(); 3. remove() 用于移除当前线程的线程本地变量。 在一些情况下手动调用 remove() 可以帮助避免内存泄漏。 ThreadLocalString threadLocal new ThreadLocal(); threadLocal.remove(); 4. initialValue() 该方法是一个 protected 方法可以被子类重写以提供线程本地变量的初始值。默认情况下initialValue() 返回 null。 通常情况下我们会通过 ThreadLocal 的子类并重写 initialValue() 方法来设定线程本地变量的初始值。 public class MyThreadLocal extends ThreadLocalString {Overrideprotected String initialValue() {return Default Value;} }// 使用自定义的 MyThreadLocal MyThreadLocal myThreadLocal new MyThreadLocal(); String value myThreadLocal.get(); // 返回 Default Value上述方法综合使用如下 public class ThreadLocalExample {// 创建一个 ThreadLocal 实例private static final ThreadLocalString threadLocalValue new ThreadLocal();public static void main(String[] args) {// 在主线程设置值threadLocalValue.set(Main Thread Value);// 创建两个子线程Thread thread1 new Thread(() - {// 在子线程1获取值String value threadLocalValue.get();System.out.println(Thread 1: value); // 输出Thread 1: null});Thread thread2 new Thread(() - {// 在子线程2设置值threadLocalValue.set(Thread 2 Value);// 在子线程2获取值String value threadLocalValue.get();System.out.println(Thread 2: value); // 输出Thread 2: Thread 2 Value});// 启动子线程thread1.start();thread2.start();// 在主线程获取值String mainThreadValue threadLocalValue.get();System.out.println(Main Thread: mainThreadValue); // 输出Main Thread: Main Thread Value// 清理主线程的值threadLocalValue.remove();} }在上述案例中可以看出每个线程中的Threadlocal变量都是独立的副本。ThreadLocal 提供了一种在多线程环境下安全地存储和访问线程本地变量的机制。每个线程都可以独立地对其进行操作互不干扰。 ThreadLocal的内存泄漏举例 场景1 任务中不执行任何有意义的代码 //  将堆内存大小设置为-Xmx256m public class ThreadLocalMemoryLeak {private static final int TASK_LOOP_SIZE 500;/*线程池*/final static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(5, 5, 1,TimeUnit.MINUTES,new LinkedBlockingQueue());static class LocalVariable {private byte[] a new byte[1024*1024*5];/*5M大小的数组*/}ThreadLocalLocalVariable threadLocalLV;public static void main(String[] args) throws InterruptedException {for (int i 0; i TASK_LOOP_SIZE; i) {poolExecutor.execute(new Runnable() {public void run() { // LocalVariable localVariable new LocalVariable(); // ThreadLocalMemoryLeak oom new ThreadLocalMemoryLeak(); // oom.threadLocalLV new ThreadLocal(); // oom.threadLocalLV.set(new LocalVariable()); // oom.threadLocalLV.remove();System.out.println(use local varaible);}});}System.out.println(pool execute over);}} 执行后我们通过cmd输入jvisualvm启动java性能监控工具(jdk自带)查看当前的性能消耗情况。 查看内存会发现内存消耗稳定在25MB左右。 场景2 在每个任务中new出一个数组执行完成后我们可以看见内存占用基本和场景1同 public class ThreadLocalMemoryLeak {private static final int TASK_LOOP_SIZE 500;/*线程池*/final static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(5, 5, 1,TimeUnit.MINUTES,new LinkedBlockingQueue());static class LocalVariable {private byte[] a new byte[1024*1024*5];/*5M大小的数组*/}ThreadLocalLocalVariable threadLocalLV;public static void main(String[] args) throws InterruptedException {for (int i 0; i TASK_LOOP_SIZE; i) {poolExecutor.execute(new Runnable() {public void run() {LocalVariable localVariable new LocalVariable(); // ThreadLocalMemoryLeak oom new ThreadLocalMemoryLeak(); // oom.threadLocalLV new ThreadLocal(); // oom.threadLocalLV.set(new LocalVariable()); // oom.threadLocalLV.remove();System.out.println(use local varaible);}});}System.out.println(pool execute over);}} 启动后内存使用情况如下 我们可以看到有毛刺现象这是因为GC造成的但是没有出现内存泄漏的情况。 场景3 启用Threadlocal public class ThreadLocalMemoryLeak {private static final int TASK_LOOP_SIZE 500;/*线程池*/final static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(5, 5, 1,TimeUnit.MINUTES,new LinkedBlockingQueue());static class LocalVariable {private byte[] a new byte[1024*1024*5];/*5M大小的数组*/}ThreadLocalLocalVariable threadLocalLV;public static void main(String[] args) throws InterruptedException {for (int i 0; i TASK_LOOP_SIZE; i) {poolExecutor.execute(new Runnable() {public void run() { // LocalVariable localVariable new LocalVariable();ThreadLocalMemoryLeak oom new ThreadLocalMemoryLeak();oom.threadLocalLV new ThreadLocal();oom.threadLocalLV.set(new LocalVariable()); // oom.threadLocalLV.remove();System.out.println(use local varaible);}});Thread.sleep(100);}System.out.println(pool execute over);}} 启动后内存使用情况如下 占用内存情况在100MB-125MB左右。 场景4 手动调用remove清除threadlocal执行查看内存情况。 public class ThreadLocalMemoryLeak {private static final int TASK_LOOP_SIZE 500;/*线程池*/final static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(5, 5, 1,TimeUnit.MINUTES,new LinkedBlockingQueue());static class LocalVariable {private byte[] a new byte[1024*1024*5];/*5M大小的数组*/}ThreadLocalLocalVariable threadLocalLV;public static void main(String[] args) throws InterruptedException {for (int i 0; i TASK_LOOP_SIZE; i) {poolExecutor.execute(new Runnable() {public void run() { // LocalVariable localVariable new LocalVariable();ThreadLocalMemoryLeak oom new ThreadLocalMemoryLeak();oom.threadLocalLV new ThreadLocal();oom.threadLocalLV.set(new LocalVariable());oom.threadLocalLV.remove();System.out.println(use local varaible);}});Thread.sleep(100);}System.out.println(pool execute over);}}启动后内存使用情况如下 此时内存使用情况跟场景1相同。  总结通过以上场景3我们可以得出在启用了threadlocal以后发生了内存泄漏。 内存泄漏原因分析 每一个Thread线程都维护了一个ThreadLocalMap映射表这个映射表的key是ThreadLocal 实例本身value 是真正需 要存储的Object也就是说ThreadLocal本身并不存储值它只是作为一个 key来让线程从ThreadLocalMap获取value。ThreadLocalMap是使用ThreadLocal的弱引用作为Key的弱引用的对象在GC 时会被回收。 图中虚线表示弱引用。 当把 threadlocal 变量置为 null 以后没有任何强引用指向 threadlocal 实例所以 threadlocal将会被gc回收。这样一来ThreadLocalMap中就会出现key为null的Entry就没有办法访问这些key为null的Entry的value如果当前 线程再迟迟不结束的话这些key为null的Entry的 value就会一直存在一条强引用链Thread Ref - Thread - ThreaLocalMap - Entry - value而这块value永远不会被访问到了所以存在着内存泄露。 只有当前线程结束后线程就不会在栈中强引用断开才会被GC回收掉。解决内存泄漏做法是当不使用线程中threadlocal变量时及时remove清除数据。 场景3中虽然线程池里面的任务执行完毕了但是线程池里面的5个线程会一直存在直到JVM退出我们set了线程的localVariable变量后没有调用 localVariable.remove()方法导致线程池里面的5个线程的threadLocals变量里面的new LocalVariable()实例没有被释放。当我们手动再每次都调用remove清除数据时内存正常。 ThreadLocal的实现中无论是get()、set()在某些时候调用了expungeStaleEntry方法用来清除Entry中Key为null的Value但是这是不及时的也不是每次都会执行的所以一些情况下还是会发生内存泄露。 只有 remove()方法中显式调用了expungeStaleEntry 方法。 总结 JVM利用设置ThreadLocalMap的Key为弱引用来避免内存泄露。 JVM 利用调用remove、get、set方法的时候回收弱引用。 当ThreadLocal存储很多Key为 null的Entry的时候而不再去调用 remove、 get、set 方法那么将导致内存泄漏。 使用线程池 ThreadLocal 时要多注意这种情况下线程是一直在不断的重复运行的从而也就造成了value可能造成累积的情况。
http://www.pierceye.com/news/548855/

相关文章:

  • 网上手机网站建设计划书百度小说风云榜排名
  • 用js来做网站帝国cms这么做网站
  • 网站建设需求分析班级网站备案服务类型
  • 网站备案幕布照片怎么算合格北京专业网站开发
  • 浙江建设职业技术学院塘栖校区网站网络推广方法有几种
  • 呢图网站场建设封面长安镇做网站
  • 搜索关键词的网站黄山做网站
  • 网络建站系统去除wordpress主题头部作者信息
  • 鼓楼微网站开发番禺有经验的网站建设
  • 对网站建设心得进入公众号继续阅读怎么弄
  • 网站建设公司投诉电话可以先做网站后备案吗
  • 顺的品牌网站设计价位网站开发合同书
  • 用html5制作个人网站深圳百度国际大厦
  • 网络网站公司网站管理平台扩展插件
  • 个人小说网站怎么做把自己做的网页变成网站
  • led网站制作网站登录后不显示内容
  • 推广网站公司兴义市住房和城乡建设局网站
  • 营销网站建设的公司哪家好创建网站超链接
  • 苏州网站优化排名推广企业网站建设价格
  • 在线制作论坛网站wordpress建立好的网站
  • 网站的功能规范商城网站静态模板下载
  • 双语言网站源码制作网页的软件哪个好
  • 政务网站建设需求网站首页页面代码
  • 网站产品详情页怎么做的用服务器做网站空间
  • 河北网站制作报价长春市建设技工学校网站
  • 盘锦做网站专家常州网站建设企业网站制作
  • 关于建设网站的报告wordpress 视频 广告插件
  • 生态养殖网站模板网赌网站建设多少钱
  • wordpress is长沙百度提升优化
  • 福州网站建设哪个好网页被禁止浏览怎么解决