分类 JAVA 下的文章

《垃圾收集》学习笔记_


第一章 简介

内存分配3种方式

静态分配:

局限 每个数据结构的大小必须在编译时可知 过程不能递归,因为对于过程的每个活动(过程体的一次执行),局部名字在内存中共享相同位置(这时一般用的是栈分配) 无法动态创建数据结构 优点 效率高,不需要在程序执行时创建和销毁栈帧 编译器知道所有数据的内存位置,可直接访问存储位置 内存需求预知,不会发生OOM

栈分配:

特点 可递归调用 栈分配的局部值,无法从过程体的一次执行保存到过程体的下一次执行(这时一般用的是静态分配) 被调用者的生命周期<=它的调用者 只有大小能在编译时确定的对象,才能作为过程的结果返回

堆分配

动态大小的对象可作为过程结果返回 数据结构大小不固定 允许把一个过程作为另一个过程的结果返回


Integer 源码方法学习_


求 32位无符号整数 前导0个数

注意使用场景,一般会用该方法的前导0个数不会少

汇编中逻辑右移可直接用指令 SHR reg/men ,n 即物理上 a>>2 比 (a>>1)>>1 快

首先想到的肯定是循环遍历

public static int numberOfLeadingZerosByLoop(int i){
        if(i==0)return 32;
        int n=0;
        while(i>>31==0){
            n++;
            i<<=1;
        }
        return n;
    }

实现简单,但平均时间略高


动手写一个并发缓存框架 历程


首先给上我们的耗时任务,和简单web框架搭建

提供一个0-20的数字,计算前n项和,为了不使得计算太快 每加一次 sleep

package com.france.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TaskServlet implements Servlet{

    @Override
    public void service(ServletRequest req, ServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
            try {
                int num=Integer.valueOf(req.getParameter("num"));
                if(num<=0)throw new Exception("数字<=0");
                if(num>=20)throw new Exception("数字>=20");
                int sum=calculateSumWithSleep(num,500);
                System.out.println("计算得到的结果是:"+sum);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    private int calculateSumWithSleep(int num,long ms){
        int sum=0;
        for(int i=0;i<=num;i++){
            sum+=i;
            try {
                Thread.sleep(ms);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return sum;
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}


Java Executors 学习笔记


创建ThreadPoolExecutor

  • ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newCachedThreadPool();
    • 为每个接收到的任务创建一个线程(如果池中没有空闲的线程)
    • 提交大量的任务,并且它们有很长的(执行)时间,会使系统过载和引发应用程序性能不佳的问题
  • ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(5);
    • 创建固定大小例如5的ThreadPoolExecutor
    • 提交超过最大线程数的任务,剩下的任务将会被阻塞,直到有空闲的线程来处理它们