线程

JVM-调优

匆匆过客 提交于 2020-03-12 11:45:39
关于CPU过载 CPU占用率及对应进程ID(pid)可以通过top命令确定,100%占有率可能由于以下两点导致: 1、堆内存不足导致频繁Full GC A、 sudo jmap -heap pid 查看堆内存的消耗情况; B、 sudo jstat -gc pid interval count 查看GC情况,示例: sudo jstat -gc 5746 3000 5 代表查看5746进程的GC情况、每隔3000毫秒打印一次、总共打印5次。如果FGC/FGCT增长明显,说明Full GC很频繁。 解决方案: 如果情况紧急,那得马上重启Java应用进程; 不紧急的话需要获取相关信息用于分析为什么堆内存被消耗完了,可能有内存泄漏问题; 1) sudo jmap -histo pid | head -n 20 查看Java对象的占用统计信息 2) sudo jmap -dump:live,format=b,file=heap.bin pid 把堆转储导出到本地文件,可以用 Eclipse MAT 工具分析内存泄漏 2、代码实现 A、top -H -p pid 先查到本地系统CPU占用率高的线程ID,把对应的线程ID拷贝下来,转为十六进制; B、sudo jstack -l -F pid | less 获取Java线程堆栈,用十六进制的本地线程ID搜索,会在某一行的nid处找到对应的线程

Linux常用多线程函数

巧了我就是萌 提交于 2020-03-12 11:29:55
Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明:   pthread_create是UNIX环境创建线程函数 int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict_attr, void*(*start_rtn)(void*), void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函 数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把 这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict

kettle的安装和使用

你离开我真会死。 提交于 2020-03-12 10:54:52
kettle被很多中小企业使用,且常常结合ERP系统、内部系统,低成本打通内外部系统的业务。 kettle是一款开源工具,更多用于数据同步,支持SQL配置、请求转发、读写数据库的功能,也有很多拓展的内部函数使用。基于JAVA开发的工具,本身也支持java的一些属性,所以强依赖于JDK。 kettle是通过工作流的方式,定义业务需要实现的节点进行拆解和实现,学习成本低,易上手。 其实我第一个关心的是性能,其次才是实现,作为开源工具,功能实现基本符合业务,应该没有太大问题。对于大业务量抽数需要重点评估,以免做了无用功。所以这里重点描述一下如何做调优 Kettle 调优 1 、 调整 JVM 大小进行性能优化,修改 Kettle 定时任务中的 Kitchen 或 Pan或Spoon 脚本。 修改脚本代码片段 set OPT=-Xmx512m -cp %CLASSPATH% -Djava.library.path=libswt\win32\ -DKETTLE_HOME="%KETTLE_HOME%" -DKETTLE_REPOSITORY="%KETTLE_REPOSITORY%" -DKETTLE_USER="%KETTLE_USER%" -DKETTLE_PASSWORD="%KETTLE_PASSWORD%" -DKETTLE_PLUGIN_PACKAGES="%KETTLE

MFC 利用工作线程 刷新 界面

谁都会走 提交于 2020-03-12 10:37:01
(1)有时候需要在MFC中开启一个工作线程来处理数据,数据处理中可能需要刷新界面对应的显示,则可以通过在工作线程中发送消息来更新界面 下面给出了一个案例 #pragma once #include <afxwin.h> class Myapp : public CWinApp //WinApp应用类 { public: //程序入口 virtual BOOL InitInstance(); }; class MyFrame :public CFrameWnd //应用程序窗口框架类 { public: MyFrame(); public: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); DECLARE_MESSAGE_MAP() // 重绘block void ReDrawBlock(CDC &DC); // 可控制的颜色块 CPoint block = CPoint(300, 300); public: CWinThread*

何为安全发布,又何为安全初始化?

你。 提交于 2020-03-12 08:40:54
前言 很多时候我们需要跨线程共享对象,若存在并发我们必须以线程安全的方式共享对象,此时将涉及到我们如何安全初始化对象从而进行安全发布,本节我们将来讨论安全初始化、安全发布,文中若有错误之处,还望批评指正。 安全发布 按照正常叙述逻辑来讲,我们应该首先讨论如何安全初始化,然后再进行安全发布分析,在这里呢,我们采取倒叙的方式,先通过非安全发布的方式讨论所出现的问题,然后最后给出如何进行安全初始化,如下,我们以单例模式为例。 public class SynchronizedCLFactory { private Singleton instance; public Singleton get() { synchronized (this) { if (instance == null) { instance = new Singleton(); } return instance; } } } public class Singleton { } 如上提供了用于获取Singleton实例的公共方法,我们通过同步关键字保持线程安全,无论有多少个线程在请求一个Singleton,也不管当前状态如何,所有线程都将获得相同的Singleton实例,Singleton初始化在第一次请求Singleton时发生,而不是在初始化Singleton类时发生,至于是否惰性初始化并不是我们关注的重点

Java同步机制-synchronized使用

五迷三道 提交于 2020-03-12 07:54:37
文章目录 synchronized简介 synchronized使用 同步普通方法 同步静态方法 同步代码块 synchronized用法总结 synchronized简介 Java平台中的任何一个对象都有一个与之关联的锁。这种锁被称为监视锁或者内部锁。 内部锁是一种排他锁,它能够保障原子性、可见性和有序性。 synchronized使用 synchronized关键字可以用来修饰方法及代码块,它有如下应用方式: 同步普通方法,锁的是当前类实例对象 同步静态方法,锁的是当前类的class对象 同步代码块,锁是括号里面的对象 同步普通方法 同步普通方法时,锁的是实例对象。我们先看下不加Synchronized修饰时情况: public class SynchronizedDemo { public void test ( ) { for ( int i = 0 ; i < 3 ; i ++ ) { System . out . println ( "当前执行线程:" + Thread . currentThread ( ) . getName ( ) ) ; try { Thread . sleep ( 200 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } } } public static

并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

笑着哭i 提交于 2020-03-12 07:04:28
并行和并发 并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件(多核线程)在同一时刻发生;而并发是指两个或多个事件(进程或者程序)在同一时间间隔内发生。计算机在宏观上并发,微观上并行。 在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 ①程序与计算不再一一对应,一个程序副本可以有多个计算 ②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区等。 ③并发程序在执行中是走走停停,断续推进的。 网上找到一个简单的例子: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。 (来自作者:龚昱阳 Dozer,链接:https://www.zhihu.com/question/33515481/answer/58849148 来源:知乎。著作权归作者所有。商业转载请联系作者获得授权

多线程

纵饮孤独 提交于 2020-03-12 05:21:33
多线程 进程 程序执行过程中具有动态性;持有资源和线程,是系统进行资源分配和调度的基本单位 线程 线程的分类 主线程:JVM调用程序mian()所产生的线程。 当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。 后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。 前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。 有时被称为轻量级进程,是程序执行中的最小单元 互斥与交互 线程实现方法 继承Thread类,重写该类的run()方法; 通过实现Runnable接口来创建线程,并重写该线程的run()方法 创建实现Callable和Future创建线程,实现call()方法 创建线程方法的优劣点 采用Runnable()、Callable()接口: 优点:还可以继承其他类,可以实现多个线程共享同一个target对象吗,从而可以将CPU,代码和数据分开,体现了较好的面向对象的思想 劣势:编程较为复杂,如果要访问当前线程需要使用Thread.currentThread()方法

黑马程序员_java08_多线程

丶灬走出姿态 提交于 2020-03-12 05:16:13
转载于: http://www.itxuexiwang.com/plus/view.php?aid=148 线程是程序中可以并行执行的任务。 java运行系统总是选当前优先级最高的处于就绪状态的线程来执行。如果几个就绪线程有相同的优先级,将会用时间片方法轮流分配处理机。 进程与线程的区别 进程属于一个独立的运行程序,线程是程序里面的一个分支。许多个线程组成一个程序的运行。 创建线程的两种方式 (1)线程类是由Thread类及其子类表示的,继承Run()方法定义了线程执行时的任务体,定义一个继承于Thread的线程类覆盖run()方法。 (2)任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable,接口中的run()方法需要实现为线程执行的任务体。 (3)可以利用Thread的类方法currentThread()获得当前执行线程的信息。 方法一: public class Person extends Thread{ public Person(String name){ this.name=name; } @Override public void run(){ super.run(); } } 1 2 3 4 5 6 7 8 9 方法二: class Res { private String name; private

黑马程序员----多线程基础

二次信任 提交于 2020-03-12 05:15:53
/** * @author Administrator * * @description Java多线程编程入门测试类 * @history */ // 方法一、继承线程类Thread class MyThread extends Thread{ public MyThread(String threadName){ // 设置当前线程的名称 currentThread().setName(threadName); } public void run(){ System.out.println(Thread.currentThread().getName()); } } // 方法二、实现Runnable接口 class MyThread2 implements Runnable{ public void run() { System.out.println(Thread.currentThread().getName()); } } public class SynTestDemo { /** *@description *@param args */ public static void main(String[] args) { // 1、线程的定义、线程和进程的区别、为什么要引入线程等 // 2、 Java实现多线程的方法主要有两种