一、Linux ps (英文全拼:process status)命令用于显示当前进程的状态
ps aux 基本输出
ps aux 列名解释
注:优化机器资源主要从占用机器cpu和mem高的程序入手
二、Linux top命令查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等
基本输出
字段解释
三、Linux top -H -p pid。查看某个进程内部线程占用情况
四、jps(Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令
五、jinfo LVMID。可以用来查看 Java 进程运行的 JVM 参数
六、jstat(Java Virtual Machine statistics monitoring tool)主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用
七、jstack(Java Stack Trace Tool)主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源
八、jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节
九、MAT(Memory Analysis Tools)是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因
此次分享准备过程中,发现JDK调试工具在Root用户下访问Yarn用户启动的Java虚拟机,获取不到信息,jstatck获取到的还不全(没有线程描述信息行)
可以使用 sudo -u yarn /usr/java/jdk1.8.0_181-cloudera/bin/jstack 这种方式获取。
使用SPRING中的线程池ThreadPoolTaskExecutor实现并发。一:不需要返回值的情况
1,初始化线程池
Java代码
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor()
poolTaskExecutor.setQueueCapacity(10000)
poolTaskExecutor.setCorePoolSize(5)
poolTaskExecutor.setMaxPoolSize(10)
poolTaskExecutor.setKeepAliveSeconds(5000)
poolTaskExecutor.initialize()
2,在线程池中执行某个线程
Java代码
poolTaskExecutor.execute(new Thread(Objct...){...})
二:需要返回值的情况
1,初始化线程池poolTaskExecutor,同上
2,新建一个类,实现Callable接口
Java代码
class GetFromDB implements Callable<User>{
private UserDao userDao
private Long userId
public GetFromDB(UserDao userDao, Long userId) {
this.userDao = userDao
this.userId = userId
}
public User call() throws DaoException {
User user = userDao.getUserById(userId)
return user
}
}
3,用之前的GetFromDB类构造一个FutureTask类
Java代码
FutureTask<User>dbtask = new FutureTask<User>(GetFromDB)
4,提交并执行
Java代码
threadpool.submit(dbtask)
5,得到返回值
Java代码
try {
User user = dbtask.get()
} catch (Exception e) {
if (e instanceof ExecutionException
&&((ExecutionException) e).getCause() instanceof DaoException) {
throw (DaoException) ((ExecutionException) e).getCause()
} else {
其他处理方式
}
}
注:一旦调用了get()方法,如果线程还未产生返回值,则将阻塞get()方法,直到得到返回值。基于此,如果你想确保线程执行完后才执行下一步操作,即使你不想得到返回值也可以调用一下此方法。当然这与多线程的初衷不符。